Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
和kuangbin的程序拍了好久,求一组hack数据#include<iostream> #include<cstdio> #include<cstring> #define M 400010 #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define Mid (l+r)>>1 using namespace std; struct tree{ int cov,yh; }Tree[M<<2]; bool mark[M]; void up(int rt){ if(Tree[rt<<1].cov==1&&Tree[rt<<1|1].cov==1)Tree[rt].cov=1; else if(Tree[rt<<1].cov==0&&Tree[rt<<1|1].cov==0)Tree[rt].cov=0; else Tree[rt].cov=-1; } void build(int l,int r,int rt){ if(l==r){ Tree[rt].cov=Tree[rt].yh=0; return ; }int mid=Mid; build(lson); build(rson); up(rt); } void down(int rt){ if(Tree[rt].yh){ if(Tree[rt<<1].cov==-1)Tree[rt<<1].yh^=1; else Tree[rt<<1].cov^=1; if(Tree[rt<<1|1].cov==-1)Tree[rt<<1|1].yh^=1; else Tree[rt<<1|1].cov^=1; Tree[rt].yh=0; } if(Tree[rt].cov==1||Tree[rt].cov==0){ Tree[rt<<1].cov=Tree[rt].cov; Tree[rt<<1|1].cov=Tree[rt].cov; } } void clean(int L,int R,int x,int l,int r,int rt){ if(L==l&&R==r){ Tree[rt].cov=x; Tree[rt].yh=0; return ; }down(rt); int mid=Mid; if(R<=mid)clean(L,R,x,lson); else if(L>mid)clean(L,R,x,rson); else clean(L,mid,x,lson),clean(mid+1,R,x,rson); up(rt); } void yh(int L,int R,int l,int r,int rt){ if(L==l&&R==r){ if(Tree[rt].cov==-1)Tree[rt].yh^=1; else Tree[rt].cov^=1; return ; }down(rt); int mid=Mid; if(R<=mid)yh(L,R,lson); else if(L>mid)yh(L,R,rson); else yh(L,mid,lson),yh(mid+1,R,rson); up(rt); } void query(int l,int r,int rt){ if(Tree[rt].cov==1){ for(int i=l;i<=r;i++) mark[i]=1; return ; } if(l==r)return; down(rt); int mid=Mid; query(lson); query(rson); } int get_num(int flag,int x,int t){ if(flag)return (x+1)*2; else{ if(t)return (x+1)*2-1; else return (x+1)*2+1; } } void debug(int l,int r,int rt){ cout<<l<<" "<<r<<" : "<<Tree[rt].cov<<" "<<Tree[rt].yh<<endl; if(l==r)return; int mid=Mid; debug(lson); debug(rson); } const int Max=(100000<<1); void print(){ bool pd=1,flag=1,temp=0; for(int i=1;i<=Max;i++){ if(mark[i])flag=0; if(mark[i]){ if(pd){ if(temp)cout<<" "; else temp=1; if(i%2)cout<<"("<<i/2-1<<","; else cout<<"["<<i/2-1<<","; pd=0; } } if(!mark[i+1]&&!pd){ if(i%2)cout<<i/2<<")"; else cout<<i/2-1<<"]"; pd=1; } } if(flag){ cout<<"empty set"; } cout<<endl; } void solve(){ char s[10]; build(1,Max,1); int Case=0; while(~scanf("%s",s)){ char q[10]; scanf("%s",q); int l,r; bool flag1=0,flag2=0; if(q[0]=='[')flag1=1; if(q[strlen(q)-1]==']')flag2=1; if(flag1)sscanf(q,"[%d,%d",&l,&r); else sscanf(q,"(%d,%d",&l,&r); l=get_num(flag1,l,0); r=get_num(flag2,r,1); if(s[0]=='U'){ if(l>r)continue; clean(l,r,1,1,Max,1); }else if(s[0]=='I'){ if(l>r)clean(1,Max,0,1,Max,1); else{ clean(1,l-1,0,1,Max,1); clean(r+1,Max,0,1,Max,1); } }else if(s[0]=='D'){ if(l>r)continue; clean(l,r,0,1,Max,1); }else if(s[0]=='C'){ if(l>r)clean(1,Max,0,1,Max,1); else{ yh(l,r,1,Max,1); clean(1,l-1,0,1,Max,1); clean(r+1,Max,0,1,Max,1); } }else{ if(l>r)continue; yh(l,r,1,Max,1); } } memset(mark,0,sizeof(mark)); query(1,Max,1); print(); /*for(int i=1;i<=Max;i++) if(mark[i])cout<<i<<" "; cout<<endl;*/ } int main(){ solve(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator