P9883题解
算法
- c[] 其实就是树状数组,设其原数组是 a[]。
- 就是问 a[] 最少有多少非零位置,才能使其生成的树状数组 c[] 符合条件。
- c[i] 的值实际上是所有使得 j+(j and (−j))=i 的 c[j] 的值加起来,再加上 a[i]。
- 如果 j+(j and (−j))=i 的 c[j] 全是 0,但 c[i] 非 0,那么 a[i] 就必须非 0;
- 如果 j+(j and (−j))=i 的 c[j] 只有一个非 0,但 c[i] 为 0,那么 a[i] 就必须非 0;
- 可以证明,其他情况下都可以让 a[i] 为 0。
代码
#include<bits/stdc++.h>
const int N=1e5+5;
int n,a[N],b[N],ans;
char sc[N];
int main(){
int T;
scanf("%d",&T);
for(;T--;){
scanf("%d %s",&n,sc+1);
ans=0;
for(int i=1; i<=n; i++) a[i]=sc[i]-'0',b[i]=0;
for(int i=1; i<=n; i++){
if(!b[i]&&a[i]||b[i]==1&&!a[i]) ++ans;
if(a[i]&&(i&-i)+i<=n) ++b[(i&-i)+i];
}
printf("%d\n",ans);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现