2022.11.15 NOIP2022 模拟赛十
炸弹威力
Source:洛谷 P6036。
记 \(f_{i,0/1}\) 表示第 \(i\) 个位置为 \(0/1\) 的答案个数,有 DP 转移:
(1-p_i)(f_{i-1,0}+f_{i-1,1}) &\to f_{i,0}\\
\sum_{j=1}^i (\prod_{k=j}^i p_k) ((1-p_{j-1})a^{b(i-j)}\sum_{k=j}^i w_k+ f_{j-1,0}) &\to f_{i,1}
\end{aligned}
\]
下面那一串式子可以递推 \(O(n)\) 解决,故总时间复杂度 \(O(n)\)。
Code
const int N=1e5+5;
db f[N][2],p[N],sp[N],w[N],s[N];
int main() {
ios::sync_with_stdio(false);
int n;db a,b;
cin>>n>>a>>b;a=pow(a,b);
FOR(i,1,n) cin>>w[i],s[i]=s[i-1]+w[i];
p[0]=0;
FOR(i,1,n) cin>>p[i];
db s1=0,s2=0,s3=0;
FOR(i,1,n) {
f[i][0]=(f[i-1][0]+f[i-1][1])*(1-p[i]);
s1=s1*p[i]*a+(1-p[i-1])*p[i],s2=s2*p[i]*a+(1-p[i-1])*p[i]*s[i-1],s3=s3*p[i]+p[i]*f[i-1][0];
f[i][1]=s1*s[i]-s2+s3;
}
printf("%.3lf\n",f[n][0]+f[n][1]);
}
序列间距
Source:CF1188C
首先排序,排序后贡献是相邻的。
枚举最小值 \(x\),设 \(f_{i,j}\) 表示前 \(i\) 个取了 \(j\) 个值,并且每次贡献都 \(\ge x\) 的方案数,计算后差分即可。
单次 DP 的复杂度是 \(O(nk)\) 的,但是注意到若某个 \(x\) 满足 \(kx<V\) 可以不做,故只用做 \(O(\frac{V}{k})\) 次,总时间复杂度是 \(O(nV)\)。
Code
const int N=1005,V=1e5,mod=998244353;
int n,K,a[N],b[N],s[N],f[N][N],g[N][N],h[N],pre[N];
int work(int x) {
if(x!=0&&V/x<K) return 0;
FOR(i,1,n) f[i][0]=1,g[i][0]=i;
int ans=0;
FOR(i,1,n) {
while(a[i]-a[pre[i]+1]>=x) pre[i]++;
FOR(k,1,K) f[i][k]=g[pre[i]][k-1],g[i][k]=(g[i-1][k]+f[i][k])%mod;
ans=(ans+f[i][K])%mod;
}
return ans;
}
int main() {
n=read(),K=read();
FOR(i,1,n) a[i]=read();
sort(a+1,a+n+1);
K--;
set<int> S;
FOR(i,1,n) FOR(j,i+1,n) S.insert(a[j]-a[i]);
vi tmp;
for(int i:S) tmp.pb(i);
int ans=0,las=0;
reverse(tmp.begin(),tmp.end());
for(int i:tmp) {
int zz=work(i);
ans=(ans+1ll*i*((zz-las+mod)%mod)%mod)%mod;
las=zz;
}
printf("%d\n",ans);
}
平衡集合
Source:CF1616H
首先将所有值插入 Trie 树中,记 \(f_u\) 表示 \(u\) 子树内选点并且不冲突的方案数,\(g_{u,v}\) 表示在 \(u,v\) 中分别选点,两子树间的点互不冲突的方案数,对 \(x\) 当前位分类讨论:
为 \(0\):
f_{x_0}+f_{y_0}+1 &\to f_{x}\\
g_{x_0,y_1}+ g_{x_1,y_0}-1+(2^{siz_{x0}}-1)(2^{siz_{x1}}-1)+(2^{siz_{y0}}-1)(2^{siz_{y1}}-1) &\to g_{x,y}
\end{aligned}
\]
为 \(1\):
g_{x0,x1} &\to f_{x}\\
g_{x0,y1}g_{x1,y0} &\to g_{x,y}
\end{aligned}
\]
注意到对于每一个 \(x\),与其对应的 \(g_{x,y}\) 只有两个,故总时间复杂度为 \(O(n\log V)\)。
Code
const int N=1.5e5+5,B=30,mod=998244353;
int x,ch[N*B][2],f[N*B],g[N*B],siz[N*B],po[N],tot=1;
void insert(int x) {
int p=1;
ROF(i,30,0) {
bool t=x>>i&1;
if(!ch[p][t]) ch[p][t]=++tot;
p=ch[p][t],siz[p]++;
}
}
int dfs(int p,int q,int d) {
if(!p||!q) return po[siz[p]+siz[q]];
if(d<0) return po[p^q?siz[p]+siz[q]:siz[p]];
int lp=ch[p][0],rp=ch[p][1],lq=ch[q][0],rq=ch[q][1];
if(x>>d&1) {
if((p^q)==0) return dfs(lp,rp,d-1);
return 1ll*dfs(lp,rq,d-1)*dfs(rp,lq,d-1)%mod;
}
int a=dfs(lp,lq,d-1),b=dfs(rp,rq,d-1),c=(0ll+a+b+mod-1)%mod;
if((p^q)==0) return c;
return (0ll+c+1ll*(mod+po[siz[lp]]-1)*(mod+po[siz[rp]]-1)%mod+
1ll*(mod+po[siz[lq]]-1)*(mod+po[siz[rq]]-1)%mod)%mod;
}
int main() {
int n=read();x=read(),po[0]=1;
FOR(i,1,n) po[i]=2ll*po[i-1]%mod;
FOR(i,1,n) insert(read());
printf("%d\n",(mod+dfs(1,1,30)-1)%mod);
}
公交路线
Source:CF475E
首先找出原图的所有边双,边双内的点对一定可以全部计算上贡献。
现在问题变成树,对于原题的答案,我们一定希望整张图是一个类似「X」形态的图,枚举「X」中间的点,枚举向上有多大,就可以快速计算贡献。
总时间复杂度同树形背包,\(O(n^2)\)。
Code
const int N=2005;
int n,m,dfn[N],low[N],dfc,cut[N*N],col[N],siz[N],tsiz[N],scc,f[N],vis[N];
vector<pii> G[N];
vi G2[N];
void dfs(int u,int fa) {
dfn[u]=low[u]=++dfc;
for(auto [v,id]:G[u]) if(fa!=v) {
if(dfn[v]) low[u]=min(low[u],dfn[v]);
else {
dfs(v,u),low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) cut[id]=1;
}
}
}
void dfs1(int u,int fa) {
col[u]=scc,siz[scc]++;
for(auto [v,id]:G[u]) if(v!=fa&&!cut[id]&&!col[v]) dfs1(v,u);
}
void dfs2(int u,int fa) {
vis[u]=1;
for(int v:G2[u]) if(v!=fa&&!vis[v]) dfs2(v,u),tsiz[u]+=tsiz[v];
}
int main() {
scanf("%d %d",&n,&m);
FOR(i,1,m) {
int x,y;scanf("%d %d",&x,&y);
G[x].pb(y,i),G[y].pb(x,i);
}
dfs(1,0);
FOR(i,1,n) if(!col[i]) ++scc,dfs1(i,0);
FOR(u,1,n) for(auto [v,id]:G[u]) if(cut[id]) G2[col[u]].pb(col[v]);
int ans=0;
FOR(i,1,scc) {
int sum=0;
FOR(j,1,scc) tsiz[j]=siz[j],vis[j]=0;
dfs2(i,0);
FOR(j,1,scc) if(i!=j) sum+=tsiz[j]*siz[j];
FOR(j,1,n) f[j]=0;
f[0]=1;
for(int v:G2[i]) ROF(j,n,tsiz[v]) f[j]|=f[j-tsiz[v]];
FOR(j,0,n) if(f[j]) ans=max(ans,sum+(n-j)*(siz[i]+j));
}
printf("%d\n",ans);
}
2022.11.15 NOIP2022 模拟赛十的更多相关文章
- 11/1 NOIP 模拟赛
11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...
- 11.7 NOIP模拟赛
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...
- 【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)
二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能 ...
- 2019.03.15 ZJOI2019模拟赛 解题报告
得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...
- 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)
卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...
- 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)
设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\ ...
- 【2019.8.11下午 慈溪模拟赛 T2】数数(gcd)(分块+枚举因数)
莫比乌斯反演 考虑先推式子: \[\sum_{i=l}^r[gcd(a_i,G)=1]\] \[\sum_{i=l}^r\sum_{p|a_i,p|G}\mu(p)\] \[\sum_{p|G}\mu ...
- 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)
树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...
- 【2019.7.15 NOIP模拟赛 T1】夹缝(mirror)(思维题)
思维题 此题应该是比较偏思维的. 假设一次反射后前进的距离是\(2^x(2y+1)\),则显然,它可以看做是前进距离为\(2^x\)的光线经过了\((2y+1)\)次反射,两者是等价的,甚至后者可能还 ...
- 2019/11/12 CSP模拟赛&&考前小总结
写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...
随机推荐
- js 判断条件分支优化
优化前: 1.简单分支优化: 2.复杂分支优化: 3.抽离分支:
- pyinstaller打包后运行提示“No module named 'PyQt5' "
记录遇到的一个很傻的问题 脚本用到了PyQt5模块,安装成功脚本可以正常运行,但是使用pyinstaller 打包后,运行 exe文件提示 No module named 'PyQt5' 原因: 因为 ...
- webpack5的基本用法
webpack的基本使用 webpack 本身功能有限: 开发模式: 仅能编译JS中的ES Module 语法 生产模式: 能编译ES Module 语法, 还能压缩JS代码 添加实例文件 npm i ...
- Linux基础环境的各项配置(三)
接上篇,安装centos操作系统后,需对系统的基础环境做一些配置,如下: 1.设置静态IP(防止每次开机可能生成不一样的IP,导致与此虚拟机通信时出现错误):DNS解析,可以ping通外网: 1.1 ...
- react lodash节流this找不到正确用法
if (!this.throttleLoadDicom) { this.throttleLoadDicom = throttle(this.loadDicomFun, 800, { leading: ...
- Postman中的测试脚本(Test scripts)
一.postman测试脚本 测试脚本是在发送请求之后运行的,并且已经从服务器接收到响应. 二.测试举例 1.设置环境变量 pm.environment.set("variable_key&q ...
- memoの关于Qt的一些用法记录
Qt自动调整窗口尺寸 之前写过,方法就是: QTimer::singleShot(0, this, [this]{ this->adjustSize(); }); 重复记录一下. 如何把一个Mo ...
- C# 通过程序执行svn更新或提交更改
实现方法: private static void RunBat(string program, string parm) { try { Process proc = new Process(); ...
- Java集合-Set接口
Set接口-介绍 Set接口的定义如下: Set是一个继承于Collection的接口,即Set也是集合中的一种.Set是没有重复元素的集合.即: Set 接口:无序,不支持索引,不可重复的集合 Se ...
- python 删除大于超过一定时间文件
import os from datetime import datetime, timedelta path = "." if __name__ == '__main__': f ...