2024.12.28测试 总结
还是超级无敌寀啊~
目录
- T1 赠送笔记本
- T2 中位数
- T3 好子集
- T4 异或
- 总结
T1 赠送笔记本
link
题意
有 n n n 个宿舍,每个宿舍 4 4 4 头奶牛,第 i i i 个宿舍有 a i a_i ai 头牛有笔记本(每头牛的笔记本都不同)。现在所有奶牛都把自己的笔记本送给与自己不同宿舍的奶牛,一头奶牛最多只能接收别人送的一本笔记本,求有多少种赠送方案,答案模 1234567891 1234567891 1234567891 。
- 1 ≤ n ≤ 47 1 \le n \le 47 1≤n≤47 , 0 ≤ a i ≤ 4 0 \le a_i \le 4 0≤ai≤4
思路
参考了 这篇题解的T5 。
注意到是计数类问题,考虑组合数,但是很难保证 “一头奶牛只收被人的一本笔记本” 。然后放弃。但是可以是 D P DP DP ,看到赠送笔记本可以给前面的牛奶也可以给后面奶牛,担也可以等价于赠送笔记本给前面的奶牛和收下前面的奶牛送出的笔记本。所以设状态 f i , j f_{i,j} fi,j表示考虑到第 i i i 个宿舍,还剩下 j j j 本笔记本没送。
- 首先我们考虑接收前面的,设当前这个宿舍 i i i 接收前面 k k k 本 ( 0 ≤ k ≤ 4 ) (0 \le k \le 4) (0≤k≤4),那么贡献为 A j k × C 4 k A_j^k \times C_4^k Ajk×C4k ;
- 再考虑往前送,设往前送 p p p 本 ( 0 ≤ p ≤ a i ) ( 0 \le p \le a_i) (0≤p≤ai),因为前面有 4 × ( i − 1 ) − ( ∑ d = 1 i − 1 a d − j ) 4 \times (i-1) - (\sum_{d=1}^{i-1} a_d - j) 4×(i−1)−(∑d=1i−1ad−j) 个人还没收到笔记本 (记这个未收到笔记本的人数为 S S S),所以贡献为 A S p × C a i p A_S^p \times C_{a_i}^p ASp×Caip ;
综上,得出状态转移方程:
f i , j − k + a i − p = f i − 1 , j × A j k × C 4 k × A S p × C a i p f_{i,j-k+a_i-p} = f_{i-1,j} \times A_j^k \times C_4^k \times A_S^p \times C_{a_i}^p fi,j−k+ai−p=fi−1,j×Ajk×C4k×ASp×Caip
注意一下,如果组合数(如 A m n A_m^n Amn 或 C m n C_m^n Cmn)要逆元求的话,预处理的过程中可能会爆栈,数很大但是又不能取模,但其实 m m m, n n n 都很小,所以直接朴素计算即可,复杂度也就 O ( n ) O(n) O(n) 。
所以 D P DP DP 的总时间复杂度就为 O ( n 2 × 4 4 ) O(n^2 \times 4^4) O(n2×44) 。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=50;
const ll mod=1234567891;ll A(ll m,ll n){ ll s=1; for(int i=0;i<n;i++) (s*=(m-i))%=mod; return s; }
ll C(ll m,ll n){ ll s=1; for(int i=0;i<n;i++) (s*=(m-i))%=mod,(s/=(i+1))%=mod; return s; }int a[maxn];
ll f[maxn][maxn*4];
int main(){int n; cin>>n;for(int i=1;i<=n;i++)cin>>a[i];int sum=0;f[0][0]=1;//f[i][j]:考虑到第 i 个宿舍,还剩下 j 本笔记本没送 for(int i=1;i<=n;i++){for(int j=0;j<=sum;j++)for(int k=0;k<=min(4,j);k++)//k:接收前面的 k 本 for(int p=0;p<=a[i];p++)//p:往前面送 p 本给那些还没有接收过本子的奶牛 (f[i][j-k+a[i]-p]+=f[i-1][j]*C(4,k)%mod*A(j,k)%mod*C(a[i],p)%mod*A(4*(i-1)-(sum-j),p)%mod)%=mod;sum+=a[i];}cout<<f[n][0];return 0;
}
T2 中位数
link
题意
序列的中位数是指:把序列从小到大排序后,下标是 n 2 + 1 \frac{n}{2}+1 2n+1 的那个数。给定一个整数序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an ,对于 a a a 序列的任意一个连续子序列 a L , a L + 1 , . . . , a R a_L,a_{L+1},...,a_R aL,aL+1,...,aR ( 1 ≤ L ≤ R ≤ n 1 \le L \le R \le n 1≤L≤R≤n), 记该连续子序列的中位数为 b L , R b_{L,R} bL,R 。显然 b b b 数组共有 n × ( n + 1 ) 2 \frac{n \times (n+1)}{2} 2n×(n+1) 个整数,求 b b b 数组的中位数。
- 1 ≤ n ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 9 1 \le n \le10^5,1 \le a_i \le 10^9 1≤n≤105,1≤ai≤109
思路
前置指示 —— 求中位数有一个很套路的方法:二分一个数 m i d mid mid,对于原序列中 < m i d \lt mid <mid 的数标记为 − 1 -1 −1;反之标记为 1 1 1。然后记所有标记求和为 s u m sum sum。若 s u m < 0 sum \lt 0 sum<0,说明中位数 < m i d \lt mid <mid ,那么向左继续二分;反之,向右二分。
对于这题,可以有一样的思路。先二分一个数 m i d mid mid,并对原序列进行标记。那么问题就转化为:统计有多少个区间,其标记和 ≥ 0 \ge 0 ≥0。
记满足条件的区间有 c n t cnt cnt 个,如果 c n t ≥ n × ( n + 1 ) 2 2 + 1 cnt≥ \frac{\frac{n \times (n+1)}{2}}{2} +1 cnt≥22n×(n+1)+1,那么说明 a n s ≥ m i d ans \ge mid ans≥mid,继续向右二分;反之向左二分。那如何计算 c n t cnt cnt ?我们考虑对标记做一个前缀和,设为 s u m sum sum,一个满足条件的区间 [ l , r ] [l,r] [l,r] 要有 s u m r − s u m l − 1 ≥ 0 sum_r − sum_{l−1} \ge 0 sumr−suml−1≥0 ,用树状数组维护即可。
时间复杂度为 O ( n l o g 2 n ) O(nlog^2 n) O(nlog2n) 。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;int n;
ll tree[maxn*2];
void Add(int x,int y){ while(x<=2*n+1) tree[x]+=y,x+=x&(-x); }
ll Query(int x){ ll sum=0; while(x) sum+=tree[x],x-=x&(-x); return sum;}int a[maxn],c[maxn];
bool Check(int x){ll res=0;Add(n+1,1);for(int i=1;i<=n;i++){c[i]=(a[i]>=x?1:-1),c[i]+=c[i-1];res+=Query(c[i]+n+1);Add(c[i]+n+1,1);}for(int i=1;i<=n;i++)Add(c[i]+n+1,-1);Add(n+1,-1);return (res>=1ll*n*(n+1)/2/2/*+1*/);//注意细节!
}int b[maxn];
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];sort(b+1,b+n+1);int l=0,r=n+1,mid;while(l+1<r){mid=l+r>>1;if(Check(b[mid])) l=mid;else r=mid;}cout<<b[l];return 0;
}
T3 好子集
link
题意
有 n n n 张卡片,每张卡片上有一个整数 d i d_i di ,这些整数之间有可能相同。求有多少个卡片子集(非空)满足子集里的卡片上的数字的乘积正好等于 g o o d v a l u e goodvalue goodvalue 。多测,答案模 1 e 9 + 7 1e9+7 1e9+7。
- g ≤ 4 g \le 4 g≤4, 1 ≤ n ≤ 100 1 \le n \le 100 1≤n≤100, 1 ≤ g o o d v a l u e ≤ 2 × 1 0 9 1 \le goodvalue \le 2 \times 10^9 1≤goodvalue≤2×109, 1 ≤ d i ≤ 2 × 1 0 9 1 \le d_i \le 2 \times 10^9 1≤di≤2×109
思路
首先可知选出的卡片上的数一定是 g o o d v a l u e goodvalue goodvalue 的因数。考虑 D P DP DP ,设 f i , j f_{i,j} fi,j 表示前 i 个数中选出的卡片子集的卡片数乘积恰好等于 j 的方案数。转移显而易见。发现状态的第二维 j 有存在意义的选择很少(因为 j 必为 g o o d v a l u e goodvalue goodvalue 的因数),可以用 map 压缩状态,这就可以通过了。复杂度大概为 O ( n V ) O(nV) O(nV) 。
有一个坑点:由于边界是f[0][1]=1 (因为不能f[0][0]=1),转移的时候又会有f[i][j]+=f[i-1][j],导致f[i][1]这一列全部多加了一个虚拟的1(1是f[0][1]的值),所以最后要记得-1。
代码
#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int maxn=105,mod=1e9+7;
ll a[maxn],b[2000005];
map<ll,ll>mp,f[maxn];
signed main(){int g; cin>>g;while(g--){int n2,n=0; ll gdval; cin>>n2>>gdval;for(int i=1,x;i<=n2;i++){cin>>x;if(gdval%x==0) a[++n]=x;}int tot=0;mp[1]=++tot,b[tot]=1;f[0][1]=1;for(int i=1;i<=n;i++)for(int j=1,m=tot;j<=m;j++){(f[i][j]+=f[i-1][j])%=mod;if(a[i]>gdval/b[j]) continue;if(gdval%(b[j]*a[i])!=0) continue;if(!mp.count(b[j]*a[i])) mp[b[j]*a[i]]=++tot,b[tot]=b[j]*a[i];(f[i][mp[b[j]*a[i]]]+=f[i-1][j])%=mod;}if(gdval==1) f[n][mp[gdval]]--,(f[n][mp[gdval]]+=mod)%=mod;//this!!!!!!!!cout<<f[n][mp[gdval]]<<"\n";for(int i=1;i<=n;i++)f[i].clear();mp.clear();}return 0;
}
T4 异或
link
题意
有一个长度为 n n n 的自然数序列 a a a , 要求将这个序列分成至少 m m m 个非空连续子段。每个子段的价值为该子段的所有数的按位异或。要使所有子段的价值按位与的结果最大,输出这个最大值。(多测)
- 1 ≤ q ≤ 12 1 \le q \le 12 1≤q≤12 , 1 ≤ m ≤ n ≤ 1000 1 \le m \le n \le 1000 1≤m≤n≤1000 , 0 ≤ a i ≤ 2 30 0 \le a_i \le 2^{30} 0≤ai≤230
思路
对于与二进制有关的题目,考虑拆位(二进制下)处理。从高到低位依次枚举答案的二进制下的每一位为 0 / 1 0/1 0/1 。
如果一段数可以划分,则尽早划分,可以证明这是优的。如果划分完可以为一段的数后还剩一些数,则考虑将其拼至最后的已经被划分的那一段之中。最后如果划分完所有数且段数 ≥ m \ge m ≥m ,那么这一位就可以为 1 1 1,否则只能为 0 0 0 。时间复杂度 O ( n ) O(n) O(n) 。就是简单贪心 (虽然我考场上不会) ,具体看代码。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int a[maxn];
int main(){int q; cin>>q;while(q--){int n,m; cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];int ans=0;for(int i=30;i>=0;i--){ans|=(1<<i);int now=0,cnt=0;for(int j=1;j<=n;j++){now^=a[j];if((now&ans)==ans) now=0,cnt++;}if(cnt<m||((ans^now)&ans)!=ans) ans^=(1<<i);}cout<<ans<<"\n";}return 0;
}
总结
不好评价,其实这些题也很常见,分不高说明本人的积累还是太 l i t t l e little little 了。
相关文章:
2024.12.28测试 总结
还是超级无敌寀啊~ 目录 T1 赠送笔记本T2 中位数T3 好子集T4 异或总结 T1 赠送笔记本 link 题意 有 n n n 个宿舍,每个宿舍 4 4 4 头奶牛,第 i i i 个宿舍有 a i a_i ai 头牛有笔记本(每头牛的笔记本都不同)。现在所有奶…...
工业相机开发操作流程
建议按照如下的流程操作相机(其中有一些步骤是可选的,已经标明): 一、载入SDK的动态链接库档MVCAMSDK.DLL。可以使用动态或者静 态加载两种方式。 如果使用C/C进行开发,在工程引用 CameraApi.h头文件(位于安装目录的SDK/DEMO/VC/include中)和…...
DeepSeek-R1 模型及GRPO算法学习
总结DeepSeek-R1 模型算法,并对其中的GRPO算法做一些学习补充。 DeepSeek-R1 论文总结 提出了通过强化学习提升大语言模型推理能力的方法,开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型,在多个推理任务上表现出色,并开源模型推动…...
Vue 3.0打造响应式用户界面的新方式
1 简介 Vue.js 是一个用于构建用户界面的渐进式框架。Vue 3.0 是其最新版本,引入了许多新特性和改进,使得开发者能够更高效地构建响应式的Web应用程序。本文将带你深入了解如何使用Vue 3.0来打造响应式用户界面,并通过实际案例和代码示例帮助你快速上手。 2 环境搭建 要开…...
爬虫基础(二)Web网页的基本原理
一、网页的组成 网页由三部分构成:HTML、JavaScript、CSS。 (1)HTML HTML 相当于网页的骨架,它通过使用标签来定义网页内容的结构。 举个例子: 它把图片标签为img、把视频标签为video,然后组合到一个界面…...
Kotlin开发(六):Kotlin 数据类,密封类与枚举类
引言 想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode,直接省时省力!再想想需要多种状…...
我的AI工具箱Tauri+Django内容生产介绍和使用
在现代内容生产环境中,高效、自动化的工具能够显著提升生产力,降低人工成本。Tauri 与 Django 结合打造的工作箱,集成了强大的 音频处理、视频剪辑、内容下载 以及 AI 文章撰写 等模块,帮助用户在多媒体内容生产的各个环节实现高效…...
openssl 生成证书 windows导入证书
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
AJAX笔记入门篇
黑马程序员视频地址: 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…...
DOM操作中childNodes与children的差异及封装方案
引言 在JavaScript的DOM操作中,childNodes和children是开发者常用的属性,但它们在浏览器中的行为差异可能导致兼容性问题。尤其是在处理空白符(如换行符\n)时,某些浏览器(如Chrome和Edge)会将空…...
数据分析系列--④RapidMiner进行关联分析(案例)
一、核心概念 1.1项集(Itemset) 1.2规则(Rule) 1.3支持度(Support) 1.3.1 支持度的定义 1.3.2 支持度的意义 1.3.3 支持度的应用 1.3.4 支持度的示例 1.3.5 支持度的调整 1.3.6 支持度与其他指标的…...
危机13小时:追踪一场GitHub投毒事件
事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…...
使用QSqlQueryModel创建交替背景色的表格模型
class UserModel(QSqlQueryModel):def __init__(self):super().__init__()self._query "SELECT name, age FROM users"self.refresh()def refresh(self):self.setQuery(self._query)# 重新定义data()方法def data(self, index, role): if role Qt.BackgroundRole…...
低代码产品插件功能一览
下图是统计的目前市面上流行的低代码、零代码产品的插件功能。 产品名称 产品类型 官方插件数量 支持拓展 官方插件功能 宜搭 零代码 3 暂不支持 云打印、CAD看图、打印表单详情 微搭 低代码 1 暂不支持 小程序 明道云 低代码 2 支持 视图、工作流节点 简道…...
buu-rip-好久不见26
简单的栈溢出,找到后面函数和输入的个数即可...
Flutter 新春第一弹,Dart 宏功能推进暂停,后续专注定制数据处理支持
在去年春节,Flutter 官方发布了宏(Macros)编程的原型支持, 同年的 5 月份在 Google I/O 发布的 Dart 3.4 宣布了宏的实验性支持,但是对于 Dart 内部来说,从启动宏编程实验开始已经过去了几年,但…...
新手项目管理的实用工具推荐
项目启动的实用工具推荐 1. MindManager MindManager 是一款功能强大且广受欢迎的思维导图工具,对于项目启动阶段的新手而言,它就像是一位贴心的 “思路梳理助手”。在项目启动初期,各种信息和想法往往杂乱无章地充斥在脑海中,而…...
2025一区新风口:小波变换+KAN!速占!
今天给大家分享一个能让审稿人眼前一亮,好发一区的idea:小波变换KAN! 一方面:KAN刚中稿ICLR25,正是风口上,与小波变换的结合还处于起步阶段,正是红利期,创新空间广阔。 另一方面&a…...
Django ORM解决Oracle表多主键的问题
现状 以Django 3.2为例 Django ORM 设计为默认使用单一主键(通常是自增的 id 字段),这一选择主要基于以下核心原因: 简化ORM设计与操作 统一访问方式外键关联简化 避免歧义冲突 主键语义明确防止隐式依赖 性能与数据库兼容 索引…...
solidity高阶 -- 线性继承
Solidity是一种面向合约的高级编程语言,用于编写智能合约。在Solidity中,多线继承是一个强大的特性,允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承,并通过不同的实例展示其使用方法和注意事项。 在Sol…...
无公网IP 外网访问 本地部署夫人 hello-algo
hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...
系统思考—蝴蝶效应
“个体行为的微小差异,可能在系统中引发巨大且不可预测的结果。” — 诺贝尔经济学得主托马斯谢林 我们常说,小变动带来大影响,这种现象,在复杂系统理论中被称为“蝴蝶效应”:即使极小的变化,也能在动态系…...
钉钉群机器人设置——python版本
钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要,很多项目执行程序后出现报错信息无法第一时间收到,因此实时预警对于监控程序还是有必要。(仅个人观点) 参考文档及博客:…...
sem_wait的概念和使用案列
sem_wait 是 POSIX 标准中定义的一个用于同步的函数,它通常用于操作信号量(semaphore)。信号量是一个整数变量,可以用来控制对共享资源的访问。在多线程编程中,sem_wait 常用于实现线程间的同步。 概念 sem_wait 的基…...
深度学习在金融风控中的应用:突破传统模型的瓶颈
深度学习在金融风控中的应用:突破传统模型的瓶颈 金融风险控制(简称“风控”)是现代金融体系中至关重要的一环,关系到金融机构的稳定性、客户的安全以及整体经济的健康运行。近年来,随着深度学习的迅猛发展,传统的风控模型正面临被颠覆的挑战,新的技术手段和思维方式正…...
【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.0.1 指针的基本概念 指针是一个变量在内存中包含的是一个地址,指向另一个数据。 Rust 中最常见的指针是引用,…...
Spring AI 在微服务中的应用:支持分布式 AI 推理
1. 引言 在现代企业中,微服务架构 已成为开发复杂系统的主流方式,而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI,使多个服务可以协同完成 AI 任务,并支持分布式 AI 推理&#x…...
QT串口通信,实现单个温湿度传感器数据的采集
1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::...
EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析
EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析 0 预览一 该文件功能`fsm_reboot.c` 文件功能函数预览二 函数功能介绍`fsm_reboot.c` 中主要函数的作用1. `ec_fsm_reboot_init`2. `ec_fsm_reboot_clear`3. `ec_fsm_reboot_single`4. `ec_fsm_reboot_all`5. `ec_fsm_reb…...
