炸弹威力

Source:洛谷 P6036。

记 \(f_{i,0/1}\) 表示第 \(i\) 个位置为 \(0/1\) 的答案个数,有 DP 转移:

\[\begin{aligned}
(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\):

\[\begin{aligned}
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\):

\[\begin{aligned}
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 模拟赛十的更多相关文章

  1. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  2. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  3. 【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)

    二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能 ...

  4. 2019.03.15 ZJOI2019模拟赛 解题报告

    得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...

  5. 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)

    卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...

  6. 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)

    设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\ ...

  7. 【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 ...

  8. 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)

    树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...

  9. 【2019.7.15 NOIP模拟赛 T1】夹缝(mirror)(思维题)

    思维题 此题应该是比较偏思维的. 假设一次反射后前进的距离是\(2^x(2y+1)\),则显然,它可以看做是前进距离为\(2^x\)的光线经过了\((2y+1)\)次反射,两者是等价的,甚至后者可能还 ...

  10. 2019/11/12 CSP模拟赛&&考前小总结

    写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...

随机推荐

  1. springboot中实现逆向工程

    如果这篇文章能给你带来帮助 不胜荣幸,如果有不同的意见也欢迎批评指正,废话不多说直接上代码.(参考文档:https://www.cnblogs.com/kibana/p/8930248.html) 第 ...

  2. 090_Java

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. ● 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载 ...

  3. vue 3.0 总线程bus引入(mitt)

    vue 3.0 移除了 $on,$off 和 $once 方法,$emit 仍然是现有 API 的一部分,因为它用于触发由父组件以声明方式附加的事件处理程序. 官方推荐使用第三方类库.  mitt举例 ...

  4. python自动化-取消"Chrome正受到自动软件的控制"提示

    chrome浏览器V78及以上版本解决做法,代码如下: from selenium import webdriver chrome_options = webdriver.ChromeOptions( ...

  5. 【DM论文阅读杂记】推荐系统 注意力机制

    Paper Title Real-time Attention Based Look-alike Model for Recommender System Basic algorithm and ma ...

  6. Java基础-类型转换、变量、变量命名规范

    类型转换 强制转换 (类型)变量名 高-->低 自动转换 低-->高 注意点 不能对布尔值进行转换 不能把对象类型转换为不相干的类型 在把高容量转换到低容量的时候,强制转换 转换的时候可能 ...

  7. Hive基本概念

    Hive Hive的相关概念 Hive的架构图 用户接口:包括 CLI.JDBC/ODBC.WebGUI.其中,CLI(command line interface)为shell命令行:Hive中的T ...

  8. 记录 springboot 整合swagger2 出现documentationPluginsBootstrapper&&NullPointerException异常

    记录 由于springboot版本高 整合swagger2出现null异常 springboot 版本: swagger2 依赖版本: 出现的异常: 解决方案: application 添加如下依赖 ...

  9. pyspark 结构化数据开发实例

    什么是SPARK? 1. 先进的大数据分布式编程和计算框架 2. 替换Hadoop 中的MR计算引擎. 3. 内存分布式计算:运行数度快 4. 可以使用不同的语言编程(java,scala,r 和py ...

  10. window JAVA 环境变量配置

    java win环境变量配置1.安装的时候拷贝出,安装目录C:\Program Files\Java\jdk1.8.0_40\2.在系统变量中,点击"新建",弹出窗口后在变量名输入 ...