AC#2 10pts 求调
查看原帖
AC#2 10pts 求调
893933
zhaoziyue2022楼主2024/7/24 20:15
#include<bits/stdc++.h>
using namespace std;
int n,m;
int add[100010]={0};
int a[100100]={0};
int ed[100010]={0},st[100010]{0},pos[100010]={0};
int sum[100010];
void change(int l,int r){
    int p=pos[l],q=pos[r];
    if(p==q){
        for(int i=l;i<=r;i++){
            a[i]=(a[i]+1)%2;
        }
        sum[p]+=(r-l+1);
    }else{
        for(int i=p+1;i<=q-1;i++){
            add[i]=(add[i]+1)%2;
        }
        for(int i=l;i<=ed[p];i++)
            a[i]=(a[i]+1)%2;
        sum[p]+=(ed[p]-l+1);
        
        for(int i=st[q];i<=r;i++)
            a[i]=(a[i]+1)%2;
        sum[q]+=(r-st[q]+1);
    }
}
long long ask(int l,int r){
    int p=pos[l],q=pos[r];
    long long ans=0;
    if(p==q){
        for(int i=l;i<=q;i++){
            ans+=a[i];
        }
        ans+=(add[p]*(r-l+1))%2;
    }else{
        for(int i=p+1;i<=q-1;i++){
            ans+=(sum[i]+add[i]*(ed[i]-st[i]+1))%2;
        }
        for(int i=l;i<=ed[p];i++)
            ans+=a[i];
        ans+=(add[p]*(ed[p]-l+1))%2;
        
        for(int i=st[q];i<=r;i++){
            ans+=a[i];
        }
        ans+=(add[q]*(r-st[q]+1))%2;
    }
    return ans;
}
int main(){
    cin>>n>>m;
    int block=sqrt(n);
    int t=n/block;
    if(n%block){
        t++;
    }
    for(int i=1;i<=t;i++){
        st[i]=(i-1)*block+1;
        ed[i]=i*block;
    }
    ed[t]=n;
    for(int i=1;i<=n;i++){
        pos[i]=(i-1)/block+1;
    }
    for(int i=1;i<=t;i++){
        for(int j=st[i];j<=ed[i];j++){
            sum[i]+=a[j];
        }
    }
    for(int i=1;i<=m;i++){
        int c,l,r;
        cin>>c>>l>>r;
        if(c==0){
            change(l,r);
        }else if(c==1){
            cout<<ask(l,r)<<endl;
        }
    }
    return 0;
}
2024/7/24 20:15
加载中...