90pts RE
查看原帖
90pts RE
230804
Durancer楼主2021/4/5 22:02

不明白为啥会RE,数组范围也开够了

/*

	U: [l,r] 赋值为1
	I: [0,l-1],[r+1,n] 赋值为0
	D: [l,r] 赋值为0
	C: [0,n]  全部区间翻转,然后[0,l-1],[r+1,n]赋值为0 
	S; [l,r] 区间内01翻转 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>
using namespace std;
const int N=2e5+9;
const int n=132010;

#define mid ((l+r)>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define len (r-l+1)

int tree[N<<2],l,r;
int laz[N<<2];
int cover[N<<2];
int ans[N];
void work(int &l, int &r)
{
	char c = getchar();
	for (; c != '(' && c != '['; c = getchar());
	int w = c == '('; l = 0;
	for (; !isdigit(c); c = getchar());
	for (; isdigit(c); c = getchar()) l = (l << 1) + (l << 3) + (c ^ 48);
	l <<= 1;
	l += w, r = 0;
	for (; !isdigit(c); c = getchar());
	for (; isdigit(c); c = getchar()) r = (r << 1) + (r << 3) + (c ^ 48);
	r <<= 1;
	for (; c != ')' && c != ']'; c = getchar());
	r -= c == ')';
}
void pushup(int rt)
{
	int ls=rt<<1;
	int rs=rt<<1|1;
	if(cover[rt]!=-1)
	{
		cover[ls]=cover[rt];
		cover[rs]=cover[rt];
		laz[ls]=laz[rs]=0;//取消覆盖,注意优先级 
		cover[rt]=-1;
	}
	if(laz[rt])//翻转
	{
		laz[ls]^=1;
		laz[rs]^=1;
		laz[rt]=0;
	} 
}
void build(int rt,int l,int r)
{
	cover[rt]=-1;
	if(l==r) return;
	build(lson);
	build(rson);
}
void update(int rt,int l,int r,int L,int R,int k)
{
	if(L<=l&&r<=R)
	{
		if(k!=2)
		{
			cover[rt]=k;
			laz[rt]=0;
			return;
		}
		else laz[rt]^=1;//翻转
		return; 
	}
	pushup(rt);
	if(L<=mid) update(lson,L,R,k);
	if(R>mid) update(rson,L,R,k);
}
void query(int rt,int l,int r)
{
	if(l==r)
	{
		if(cover[rt]==-1) ans[l]=0;
		else ans[l]=cover[rt]^laz[rt];
		return;
	}
	pushup(rt);
	query(lson);
	query(rson);
}
void put_ans()
{
	int flag=0;
	int Emp=0;
	for(int i=0;i<=n;++i)
	{
		if(ans[i]&&!flag)
		{
			flag=1;
			Emp=1;
			if (i & 1)
				printf("(%d,",(i-1)>>1);
			else 
				printf("[%d,",i>>1);
		}
		if (!ans[i]&&flag)
		{
			flag=0;
			if(i&1) printf("%d] ", (i-1)>>1); 
			else printf("%d) ", i>>1);
		}
	}
	if (!Emp) puts("empty set");
}
int main()
{
	char s;
	build(1,0,n);
	while(cin>>s)
	{
		work(l,r);
		if(l>r) continue;
		if(s=='U') update(1,0,n,l,r,1);
		else if(s=='I') update(1,0,n,0,l-1,0),update(1,0,n,r+1,n,0);
		else if(s=='D') update(1,0,n,l,r,0);
		else if(s=='C') 
		{
			update(1,0,n,0,n,2);//区间翻转
			update(1,0,n,0,l-1,0);
			update(1,0,n,r+1,n,0);	
		} 
		else if(s=='S') update(1,0,n,l,r,2);
		//for(int i=0;i<=32;i++) cout<<laz[i]<<" ";
	}
	query(1,0,n);
	put_ans();
	return 0;
}
2021/4/5 22:02
加载中...