社区讨论

分块,#8 1.08s,#9 1.10s,tle求条

P5057[CQOI2006] 简单题参与者 4已保存回复 3

讨论操作

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

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

#define int long long
#define maxn 500005

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;
}
inline void out(int x){
    if(x<0)putchar('-'),x=-x; 
    if(x<10)putchar(x+'0');
    else out(x/10),putchar(x%10+'0');
}
int n,m;
int a[maxn];
int k[1005];
int tag[1005];
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==1){
			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]!=tag[i/kcnt]){
						++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]!=tag[i/kcnt]){
						++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]!=tag[i/kcnt]){
						++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;l=read();l--;
			if(a[l]!=tag[l/kcnt]){
			    out(1);printf("\n");
			}
			else{out(0);printf("\n");}
		}
	}
	return 0;
}

回复

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

正在加载回复...