【有关注为回报qwq】再次求调分块/dk/dk/dk
查看原帖
【有关注为回报qwq】再次求调分块/dk/dk/dk
253765
houpingze楼主2020/12/28 21:31
#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30)
#define int long long 
using namespace std;
int read(){
    int res=0,fs=1; char c=getchar();
    while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
    return res*fs;
}
void print(int x){
    if(x<0) { putchar('-'); x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
int S;
int lazy[200005]; 
int open[1005],close[1005];
bool a[202020];
int n,cnt,m,ans,tmp,l,r,k,z,x[200005],y[200005],id[200005],v[1010];
inline void sh(int l,int r){ //修改操作

    int ll=id[l],rr=id[r]; 
    if(ll==rr){
        for(int i=l;i<=r;i++) {
        	open[ll]-=a[i];
        	a[i]=!a[i];
        	open[ll]+=a[i];
		}
        return ;
    } 
    for(int i=ll+1;i<=rr-1;++i) {
//        v[i]+=k*(y[i]-x[i]+1);
//		swap(open[i],close[i]);
		open[i]=S-open[i];
        lazy[i]^=1;     
    } 
    for(int i=l;i<=y[ll];++i) {
        	open[ll]-=a[i];
        	a[i]=!a[i];
        	open[ll]+=a[i];
	}
    for(int i=x[rr];i<=r;++i){
        	open[ll]-=a[i];
        	a[i]=!a[i];
        	open[ll]+=a[i];   	
    }
}
inline int cx(int l,int r){//查询操作
    //l~~r
    int ll=id[l],rr=id[r];
    int ret=0;
    if(ll==rr){
        for(int i=l;i<=r;i++) ret+=(lazy[ll]^a[i]);
        return ret;
    } 
    for(int i=ll+1;i<=rr-1;++i) ret+=open[i];

    for(int i=l;i<=y[ll];++i) ret+=(lazy[ll]^a[i]);
    for(int i=x[rr];i<=r;++i) ret+=(lazy[rr]^a[i]);
    return ret; 
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;   
    S=sqrt(n); 
    for(int i=1;i<=S;i++){
        x[i]=(i-1)*S+1,y[i]=min(i*S,n);
    } 
    if(x[S]<n) S++,x[S]=y[S-1]+1,y[S]=n; 
    for(int i=1;i<=S;i++){ 
        for(int j=x[i];j<=y[i];j++) {
        	id[j]=i; 
		}
    } 
    while(m--){
        int op;
        cin>>op;
        if(op==0){
            cin>>l>>r; 
            sh(l,r); 
        }else if(op==1){
            cin>>l>>r; 
            cout<<cx(l,r)<<endl;
        }

    }
    return 0;
}
2020/12/28 21:31
加载中...