求助,样例没过,悬赏 1 关注
查看原帖
求助,样例没过,悬赏 1 关注
629192
lisida0820楼主2022/11/22 19:53
#include <bits/stdc++.h>
namespace IO{
	#define LL long long
	inline LL read(){
		LL x=0,f=1;char c=getchar();
		for (;!isdigit(c);c=getchar())if (c=='-')f=-1;
		for (;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
		return x*f;
	}
	inline void write(LL x,char c='\n'){
		if (x){
			if (x<0)x=-x,putchar('-');
			char a[30];short l;
			for (l=0;x;x/=10)a[l++]=x%10^48;
			for (l--;l>=0;l--)putchar(a[l]);
		}else putchar('0');putchar(c);
	}
}using namespace IO;
using namespace std;

#define ls(now) (now<<1)
#define rs(now) (now<<1)
const int N = 132010;
struct Segment_Tree{//Cover区间覆盖标记,Reverse区间翻转标记 
	int l,r,Cover,Reverse;
}tree[N<<2];int res[N],n=N;
void Read(int &l,int &r){
	l=r=0;char ch=getchar();
	while (ch!='('&&ch!='[')ch=getchar();
	int flag=(ch=='(');
	while (!isdigit(ch))ch=getchar();
	while (isdigit(ch))l=l*10+ch-48,ch=getchar();
	l<<=1;l+=flag;
	while (!isdigit(ch))ch=getchar();
	while (isdigit(ch))r=r*10+ch-48,ch=getchar();
	while (ch!=')'&&ch!=']')ch=getchar();
	r<<=1;r-=ch==')';
}
void build(int now,int l,int r){
	tree[now].l=l,tree[now].r=r,tree[now].Cover=-1;
	if (l==r)return;
	int mid=(l+r)>>1;
	build(ls(now),l,mid);
	build(rs(now),mid+1,r);
}
void pushdown(int now){
	if (tree[now].Cover!=-1)
		tree[ls(now)].Cover=tree[rs(now)].Cover=tree[now].Cover,
		tree[ls(now)].Reverse=tree[rs(now)].Reverse=0,
		tree[now].Cover=-1;
	if (tree[now].Reverse)
		tree[ls(now)].Reverse^=1,
		tree[rs(now)].Reverse^=1,
		tree[now].Reverse=0;
}
void update(int now,int x,int y,int val){
	if (tree[now].l>y||tree[now].r<x||x>y)return;
	if (x<=tree[now].l&&tree[now].r<=y){
		if (val!=2)tree[now].Cover=val,tree[now].Reverse=0;
		else tree[now].Reverse^=1;
		return;
	}
	pushdown(now);
	update(ls(now),x,y,val);
	update(rs(now),x,y,val);
}
void Sort_Interval(int now){
	if (tree[now].l==tree[now].r)
		return res[tree[now].l]=tree[now].Cover==-1?
		0:tree[now].Cover^tree[now].Reverse,void();
	pushdown(now);
	Sort_Interval(ls(now));
	Sort_Interval(rs(now));
}
int main(){
	build(1,0,n);char s[40];
	while (scanf("%s",s)!=EOF){
		int l,r;Read(l,r);
		if (s[0]=='U')
			update(1,l,r,1);
		else if (s[0]=='I')
			update(1,0,l-1,0),update(1,r+1,n,0);
		else if (s[0]=='D')
			update(1,l,r,0);
		else if (s[0]=='C')
			update(1,0,n,2),update(1,0,l-1,0),update(1,r+1,n,0);
		else
			update(1,l,r,2);
	}
	Sort_Interval(1);
	int flg=0,ans=0;
	for (int i=0;i<=n;i++){
//		write(res[i]);
		if (res[i]&&!flg){
//			puts("Debug");
			flg=ans=1;
			if (i&1)printf("(%d,",i-1>>1);
			else printf("[%d,",i>>1);
		}
		if (!res[i]&&flg){
//			puts("Debug");
			flg=0;
			if (i&1)printf("%d] ",i-1>>1);
			else printf("%d) ",i>>1);
		}
	}
	if (!ans)puts("empty set");
	return 0;
}

错因:读入完之后 res 数组中的元素全部为 00,所以大致是 build、update、pushdown 三个函数可能有误,但调两天死活调不出QAQ

2022/11/22 19:53
加载中...