分块求卡
查看原帖
分块求卡
1009027
stils楼主2024/1/1 15:22

分块板子,100分但是没AC

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m;
int c,x,y;
bool a[N];
int st[N],ed[N],pos[N],add[N],sum[N],block,t;
void build(){
    block=sqrt(n);
    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];
    }
}

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;
    }
    else{
        for(int i=p+1;i<=q-1;i++)add[i]++;
        for(int i=L;i<=ed[p];i++)a[i]=(a[i]+1)%2;
        for(int i=st[q];i<=R;i++)a[i]=(a[i]+1)%2;
    }
}
int query(int L,int R){
    int ans=0;
    for(int i=L;i<=R;i++){
        int p=pos[i];
        if((a[i]+add[p])%2==1)ans++;
        
    }
    return ans;
}

int main(){
    cin>>n>>m;
    build();
    while(m--){
        cin>>c>>x>>y;
        if(c==0)change(x,y);
        if(c==1)cout<<query(x,y)<<endl;
    }
    return 0;
}
  
2024/1/1 15:22
加载中...