2017.5.12 校门外的区间 思考记录

时间:2022-11-25 21:36:48

        这题很裸,只要维护单点1,0就行了、、

        不同运算表示  :

            u  : 全1

            d  : 全0

             i  : 以外全0

            c  : 取反,以外取0

            s  :取反



线段树标记记得下传时当前点标记清零 ,然后就没了

     


   犯的错误:   1、 标记忘清零、

                          2、 小数时的括号 

                              3、特判!!!0!!! 0!!!!0 !!!!



码:

#include<iostream>
#include<cstdio>
using namespace std;
#define zuo l,mid,o<<1
#define you mid+1,r,o<<1|1
#define N 131075 
int quan1[N<<2],quan0[N<<2],rev[N<<2],a,b,op,la,lb,i,lin; 
char ch,zkh,ykh,douhao;
bool yes,lianxu,jieshu,yici=1;
void down(int o)
{
	if(quan0[o]==1)
   {
   quan0[o<<1]=1;
     quan1[o<<1]=0; 
	 rev[o<<1]=0;  	
   	   quan0[o<<1|1]=1;
     quan1[o<<1|1]=0; 
	 rev[o<<1|1]=0;  


   }	
		if(quan1[o]==1)
   {
   quan0[o<<1]=0;
     quan1[o<<1]=1; 
	 rev[o<<1]=0;  	
   	   quan0[o<<1|1]=0;
     quan1[o<<1|1]=1; 
	 rev[o<<1|1]=0;  


   }
	if(rev[o]==1)
	{
		 rev[o<<1]^=1;
		 rev[o<<1|1]^=1;  	
	}
rev[o]=0;
quan0[o]=0;
quan1[o]=0;
}
void gai(int l,int r,int o)
{	if(l!=r)down(o);
	if(a<=l&&r<=b)
	{
		if(op==1)
		{
			rev[o]=0;
			quan1[o]=1;
			quan0[o]=0;			
		}
		if(op==2)
		{
			rev[o]=0;
			quan1[o]=0;
			quan0[o]=1;
		}
		if(op==3)
		{
			rev[o]^=1;		
		}
		if(l!=r)down(o);
		return;	
	}


int mid=(l+r)>>1;
if(a<=mid)gai(zuo);
if(b>=mid+1)gai(you);
}
void zhao(int l,int r,int o) 
{if(l!=r)down(o);
	if(l==r)
	{
		 lin=0;
		if(quan0[o])lin=0;
		if(quan1[o])lin=1;
		if(rev[o])lin^=1;
			
       return ;
   } 


int mid=(l+r)>>1;
if(a<=mid)zhao(zuo);
if(a>=mid+1)zhao(you);		
}
int main()
{  
  
	while(1)
	{
		if(scanf("%c",&ch)==EOF)break;
	while((ch==' '||ch=='\n'||ch=='\r'))if(scanf("%c",&ch)==EOF){jieshu=1;break;}
		if(jieshu)break;
					scanf("%c",&zkh);scanf("%c",&zkh);	
			scanf("%d",&a);
			scanf("%c",&douhao);
			scanf("%d",&b);
			scanf("%c",&ykh);
			a*=2;
			b*=2;
			if(zkh=='(')a++;
			if(ykh==')')b--;
		    if(ch=='U')
		{
            op=1;
            gai(1,N,1);
		}
			if(ch=='I')
		{
			op=2;
			la=a;
			lb=b;
			a=1;
			b=la-1;
			if(b>=a)gai(1,N,1);
			a=lb+1;
			b=N;
			if(b>=a)gai(1,N,1);	
		}
			if(ch=='D')
		{
			op=2;
			if(b>=a)gai(1,N,1);	
		}
			if(ch=='C')
		{
			op=3;
			gai(1,N,1);
			op=2;
			la=a;
			lb=b;
			a=1;
			b=la-1;
			if(b>=a)gai(1,N,1);
			a=lb+1;
			b=N;
			if(b>=a)gai(1,N,1);	
		}
			if(ch=='S')
		{
			op=3;
			if(b>=a)gai(1,N,1);
		}
	}
for(i=0;i<=131071;i++)	
	{
		a=i;lin=0;
		zhao(1,N,1);
	if(lin==1)
	{
		yes=1;
		if(lianxu==1)
		{
		continue;		
		}
		if(lianxu==0)
		{
			lianxu=1;
		if(a%2==1)
		{
		if(!yici)printf(" (%d,",a/2);
		  else {yici=0;printf("(%d,",a/2);		  }	
		}	else if(!yici)printf(" [%d,",a/2);
		  else {yici=0;printf("[%d,",a/2);		  }		
		}
    }else
    {
    	if(lianxu==0)
		{
		continue;		
		}
		if(lianxu==1)
		{
			lianxu=0;
		if(a%2==1)
		{
		printf("%d]",a/2);	
		}	else  printf("%d)",a/2);		
		}
	}
	}
	if(yes==0)
	{
		cout<<"empty set";
	}
}