1 solutions

  • 0
    @ 2025-11-5 17:35:27

    C++ :

    //SegTree & Lazy_Mark by stdafx.
    // [0,65535]
    
    #define cson l,r,rt
    #define lson l,m,t
    #define rson m+1,r,t|1
    
    #define MAXN 65540UL
    #define MAXL 20UL
    
    #include <cstdio>
    #include <queue>
    
    std::queue<int> que;
    
    int tree[MAXN<<2],posl,posr,tp,mark[MAXN<<2];
    bool final[MAXN][2];
    char op[MAXL],interval[MAXL];
    
    inline void Clear_mark(int l,int r,int rt){
    	if(!mark[rt]||l==r) return;
    	int t=rt<<1;
    	if(mark[rt]==1||mark[rt]==2){
    		mark[t]=mark[t|1]=mark[rt];
    	}
    	else{
    		if(mark[t]==1) mark[t]=2;
    		else if(mark[t]==2) mark[t]=1;
    		else if(mark[t]==3) mark[t]=0;
    		else mark[t]=3;
    		t|=1;
    		if(mark[t]==1) mark[t]=2;
    		else if(mark[t]==2) mark[t]=1;
    		else if(mark[t]==3) mark[t]=0;
    		else mark[t]=3;
    	}
    	mark[rt]=0;
    	return;
    }
    
    inline void Update_mark(int l,int r,int rt){
    	Clear_mark(cson);
    	if(posl<=l&&posr>=r){
    		//printf("[%d,%d] r=%d\n",l,r,mark[rt]);
    		if(tp==1||tp==2){
    			mark[rt]=tp;
    		}
    		else{
    			if(mark[rt]==1) mark[rt]=2;
    			else if(mark[rt]==2) mark[rt]=1;
    			else if(mark[rt]==3) mark[rt]=0;
    			else mark[rt]=3;
    		}
    		//printf("Change to %d\n",mark[rt]);
    		return;
    	}
    	int m=(l+r)>>1,t=rt<<1;
    	if(posl<=m) Update_mark(lson);
    	if(posr>m) Update_mark(rson);
    	return;
    }
    
    inline void UPDATE_MARK(int l,int r,int t){
    	if(l>r) return;
    	posl=l,posr=r,tp=t;
    	Update_mark(0,65536,1);return;
    }
    
    inline void Work_Ingter(int l,int r){
    	//printf("%d %d\n",l,r);
    	if(l>r) return;
    	if(op[0]=='U') UPDATE_MARK(l,r,1);
    	else if(op[0]=='I') UPDATE_MARK(0,l-1,2),UPDATE_MARK(r+1,65536,2);
    	else if(op[0]=='D') UPDATE_MARK(l,r,2);
    	else if(op[0]=='C') UPDATE_MARK(0,l-1,2),UPDATE_MARK(r+1,65536,2),UPDATE_MARK(l,r,3);
    	else if(op[0]=='S') UPDATE_MARK(l,r,3);
    	return;
    }
    
    inline void Read(int &l,int &r){
    	int p=1;l=r=0;
    	for(/**/;interval[p]<='9'&&interval[p]>='0';p++) l=(l<<1)+(l<<3)+interval[p]-48;
    	for( p++;interval[p]<='9'&&interval[p]>='0';p++) r=(r<<1)+(r<<3)+interval[p]-48;
    	int new_l=l,new_r=r;
    	if(interval[0]=='(') new_l++;
    	if(interval[p]==')') new_r--;
    	Work_Ingter(new_l,new_r);
    	r--;
    	return;
    }
    
    inline void Clear(int l,int r,int rt){
    	if(!tree[rt]||l==r) return;
    	int t=rt<<1;
    	if(tree[rt]==1||tree[rt]==2){
    		tree[t]=tree[t|1]=tree[rt];
    	}
    	else{
    		if(tree[t]==1) tree[t]=2;
    		else if(tree[t]==2) tree[t]=1;
    		else if(tree[t]==3) tree[t]=0;
    		else tree[t]=3;
    		t|=1;
    		if(tree[t]==1) tree[t]=2;
    		else if(tree[t]==2) tree[t]=1;
    		else if(tree[t]==3) tree[t]=0;
    		else tree[t]=3;
    	}
    	tree[rt]=0;
    	return;
    }
    
    inline void Update(int l,int r,int rt){
    	Clear(cson);
    	if(posl<=l&&posr>=r){
    		if(tp==1||tp==2){
    			tree[rt]=tp;
    		}
    		else{
    			if(tree[rt]==1) tree[rt]=2;
    			else if(tree[rt]==2) tree[rt]=1;
    			else if(tree[rt]==3) tree[rt]=0;
    			else tree[rt]=3;
    		}
    		return;
    	}
    	int m=(l+r)>>1,t=rt<<1;
    	if(posl<=m) Update(lson);
    	if(posr>m) Update(rson);
    	return;
    }
    
    inline void UPDATE(int l,int r,int t){
    	if(l>r) return;
    	posl=l,posr=r,tp=t;
    	Update(0,65536,1);return;
    }
    
    inline void Build(int l,int r,int rt){
    	Clear(cson);
    	Clear_mark(cson);
    	if(l==r){
    		//if(l<10) printf("%d %d %d\n",l,tree[rt],mark[rt]);
    		if(tree[rt]==1||tree[rt]==3) final[l][0]=true;
    		if(mark[rt]==1||mark[rt]==3) final[l][1]=true;
    		return;
    	}
    	int m=(l+r)>>1,t=rt<<1;
    	Build(lson);Build(rson);
    	return;
    }
    
    inline void Work(){
    	int l,r;Read(l,r);
    	if(op[0]=='U') UPDATE(l,r,1);
    	else if(op[0]=='I') UPDATE(0,l-1,2),UPDATE(r+1,65536,2);
    	else if(op[0]=='D') UPDATE(l,r,2);
    	else if(op[0]=='C') UPDATE(0,l-1,2),UPDATE(r+1,65536,2),UPDATE(l,r,3);
    	else if(op[0]=='S') UPDATE(l,r,3);
    	//Build(1,65536,1);
    	return;
    } 
    
    //1 -> true
    //2 -> false
    //3 -> change
    
    int main(){
    	while(~scanf("%s%s",op,interval)) Work();
    	Build(0,65536,1);
    	bool pt=false;
    	for(int i=0;i<=65537;i++){
    		int r=i;
    		if(!final[i][0]){
    			if(final[i][1]) printf("[%d,%d] ",i,i),pt=true;
    		}
    		while(final[r][0]) r++;
    		if(i==r) continue;
    		pt=true;
    		if(final[i][1]) printf("[");
    		else printf("(");
    		printf("%d,%d",i,r);
    		if(final[r][1]) printf("] ");
    		else printf(") ");i=r;
    	}
    	if(!pt) puts("empty set");
    	return 0;
    }
    
    • 1

    Information

    ID
    18578
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By