社区讨论

求助,10pts,ac on #2

P3870[TJOI2009] 开关参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m3zkfd77
此快照首次捕获于
2024/11/27 15:29
去年
此快照最后确认于
2024/11/27 16:02
去年
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
using namespace std;

#define maxn 200005

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

int n,m;
int a[maxn];
int k[2005];
int tag[2005];
int kcnt;

signed main(){
	n=read();m=read();
	kcnt=sqrt(n);
	for(int i=0;i<n;++i) a[i]=0;
	while(m){
	    m--;
		int opt;
		opt=read();
		int wym1,wym2;
		if(opt==0){
			int l,r;
			l=read();r=read();
			l--;r--;
			wym1=l/kcnt;wym2=r/kcnt;
			if(wym1==wym2){
				for(int i=l;i<=r;++i){
					a[i]^=1;
					if(a[i]==1){
						++k[i/kcnt];
					}
					else{
						--k[i/kcnt];
					}
				}
				continue;
			}//一个块内的修改
			if(l%kcnt!=0){
				for(int i=l;i<=(wym1+1)*kcnt-1;++i){
					a[i]^=1;
					if(a[i]==1){
						++k[i/kcnt];
					}
					else{
						--k[i/kcnt];
					}
				}
				++wym1;
			}
			if((r+1)%kcnt!=0){
				for(int i=wym2*kcnt;i<=r;++i){
					a[i]^=1;
					if(a[i]==1){
						++k[i/kcnt];
					}
					else{
						--k[i/kcnt];
					}
				}
				--wym2;
			}//单点的修改
			for(int i=wym1;i<=wym2;++i){
				k[i]=kcnt-k[i];//区间修改
				tag[i]^=1;//单点修改
			}
		}
		else{
			int ans=0;
			int l,r;l=read();r=read();l--;r--;
			wym1=l/kcnt;wym2=r/kcnt;
			if(wym1==wym2){
				for(int i=l;i<=r;++i){
					if(tag[i]==0) {if(a[i]==1) ++ans;}
					else {if(a[i]==0) ++ans;}
				}
				cout<<ans<<endl;
				continue;//一个区间内查询
			}
			if(l%kcnt!=0){
				for(int i=l;i<=(wym1+1)*kcnt-1;++i){
					if(tag[i]==0) {if(a[i]==1) ++ans;}
					else {if(a[i]==0) ++ans;}
				}
				++wym1;
			}
			if((r+1)%kcnt!=0){
				for(int i=wym2*kcnt;i<=r;++i){
					if(tag[i]==0) {if(a[i]==1) ++ans;}
					else {if(a[i]==0) ++ans;}
				}
				--wym2;
			}//单点查询
			for(int i=wym1;i<=wym2;++i){
				ans+=k[i];
			}//块的修改
			cout<<ans<<endl;
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...