為什麼測試點一本地對了而測的時候全WA了
查看原帖
為什麼測試點一本地對了而測的時候全WA了
554001
QuQi_ZhouSi楼主2024/7/23 10:57

如題

#include<bits/stdc++.h>
#define  int long long
using namespace std;
const int N=300020;
int read(){
    int sz=0,zf=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') zf=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        sz=sz*10+(ch-'0');
        ch=getchar();
    }
    return sz*zf;
}

int a[N],add[N<<2],sum[N<<2];
void getup(int pp){
    sum[pp]=sum[pp<<1]+sum[pp<<1|1];
}
void build(int l,int r,int pp){
    if(l==r){
        sum[pp]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,pp<<1),build(mid+1,r,pp<<1|1);
    getup(pp);
}
void pushdown(int pp,int len){
    if(add[pp]) add[pp<<1]^=1,add[pp<<1|1]^=1,sum[pp<<1]=(len-(len>>1))-sum[pp<<1],sum[pp<<1|1]=(len>>1)-sum[pp<<1|1],add[pp]=0;
}
int query(int L,int R,int l,int r,int pp){
    if(l>=L&&r<=R) return sum[pp];
    pushdown(pp,r-l+1);
    int mid=(r+l)>>1,tot=0;
    if(L<=mid) tot+=query(L,R,l,mid,pp<<1);
    if(mid+1<=R) tot+=query(L,R,mid+1,r,pp<<1|1);
    return tot;
}
void update(int L,int R,int l,int r,int pp){
    pushdown(pp,r-l+1);
    if(l>=L&&r<=R){
        add[pp]^=1,sum[pp]=r-l+1-sum[pp];
        return;
    }
    int mid=(l+r)>>1;
    if(L<=mid) update(L,R,l,mid,pp<<1);
    if(mid+1<=R) update(L,R,mid+1,r,pp<<1|1);
    getup(pp);
}

signed main(){
    int n=read(),m=read();
    for(int i=1;i<=n;i++) a[i]=getchar()-'0';
    build(1,n,1);
    while(m--){
        int p=read(),l=read(),r=read();
        switch(p){
        case 0:
            update(l,r,1,n,1);
            break;
        case 1:
            printf("%lld",query(l,r,1,n,1));
            puts("");
            break;
        }
    }
    return 0;
}
2024/7/23 10:57
加载中...