蒟蒻分块10分求助!!!
查看原帖
蒟蒻分块10分求助!!!
214852
Yesterday_lzh楼主2021/10/8 20:53
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
struct Kuai{
	int l,r,sum,st;
}s[20010];
int n,m,w,a[200010],k[200010],c,x,y,ans;
int main(){
	cin>>n>>m;
	w=sqrt(n);
	for(int i=1;i<=w;i++){
		s[i].l=(i-1)*w+1;
		s[i].r=i*w;
	}
	if(s[w].r<n){
		w++;
		s[w].l=s[w-1].r+1;
		s[w].r=n;
	} 
	for(int i=1;i<=w;i++)
		for(int j=s[i].l;j<=s[i].r;j++)
			k[j]=i;
	for(int i=1;i<=m;i++){
		cin>>c>>x>>y;
		int p=k[x],q=k[y];
		if(!c){
			if(p==q)
				for(int j=x;j<=y;j++){
					a[j]^=1;
					if(a[j]) s[p].sum++;
					else s[p].sum--;
				}
			else{
				for(int j=x;j<=s[p].r;j++){
					a[j]^=1;
					if(a[j]) s[p].sum++;
					else s[p].sum--;
				}
				for(int j=s[q].l;j<=y;j++){
					a[j]^=1;
					if(a[j]) s[q].sum++;
					else s[q].sum--;
				}
				for(int j=p+1;j<=q-1;j++) s[j].st^=1;
			}
		}
		else{
			ans=0;
			if(p==q){
				if(s[p].st){
					for(int j=s[p].l;j<=s[p].r;j++){
						a[j]^=1;
						if(a[j]) s[p].sum++;
						else s[p].sum--;
					}
					s[p].st=0;
				}
				for(int j=x;j<=y;j++) if(a[j]) ans++;
			}
			else{
				if(s[p].st){
					for(int j=x;j<=s[p].r;j++){
						a[j]^=1;
						if(a[j]) s[p].sum++;
						else s[p].sum--;
					}
					s[p].st=0;
				}	
				for(int j=x;j<=s[p].r;j++) if(a[j]) ans++;	
				if(s[q].st){
					for(int j=s[q].l;j<=y;j++){
						a[j]^=1;
						if(a[j]) s[q].sum++;
						else s[q].sum--;
					}
					s[q].st=0;
				}	
				for(int j=s[q].l;j<=y;j++) if(a[j]) ans++;
				for(int j=p+1;j<=q-1;j++)
					if(s[j].st) ans+=s[j].r-s[j].l+1-s[j].sum;
					else ans+=s[j].sum;
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}
2021/10/8 20:53
加载中...