1 条题解

  • 0
    @ 2025-8-24 22:52:41

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar naroto2022
    花开花谢泪满巾,羊走羊归空余情。​

    搬运于2025-08-24 22:52:41,当前版本为作者最后更新于2024-02-05 17:19:51,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P9883题解

    算法

    • c[]c[] 其实就是树状数组,设其原数组是 a[]a[]
    • 就是问 a[]a[] 最少有多少非零位置,才能使其生成的树状数组 c[]c[] 符合条件。
    • c[i]c[i] 的值实际上是所有使得 j+(j and (j))=ij+(j \ \operatorname{and} \ (-j))=ic[j]c[j] 的值加起来,再加上 a[i]a[i]
    • 如果 j+(j and (j))=ij+(j \ \operatorname{and} \ (-j))=ic[j]c[j] 全是 00,但 c[i]c[i]00,那么 a[i]a[i] 就必须非 00
    • 如果 j+(j and (j))=ij+(j \ \operatorname{and} \ (-j))=ic[j]c[j] 只有一个非 00,但 c[i]c[i]00,那么 a[i]a[i] 就必须非 00
    • 可以证明,其他情况下都可以让 a[i]a[i]00

    代码

    #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;
    }
    
    • 1

    信息

    ID
    9393
    时间
    1000ms
    内存
    1024MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者