【bzoj1493】项链工厂【线段树】
2015-02-15 19:08
246 查看
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1493
这题可以用线段树,不过要额外维护左端点颜色、右端点颜色,以及这条线段上颜色有几个“部分”。
下传标记,当且仅当当前线段是纯色的时候(否则它下面一定有更晚染色的线段)。
吐槽一下,我写pushdown的时候把数组名rc写成了lc......
真是人民群众喜闻乐见。
敬请指教,神犇轻喷- -
这题可以用线段树,不过要额外维护左端点颜色、右端点颜色,以及这条线段上颜色有几个“部分”。
下传标记,当且仅当当前线段是纯色的时候(否则它下面一定有更晚染色的线段)。
吐槽一下,我写pushdown的时候把数组名rc写成了lc......
真是人民群众喜闻乐见。
敬请指教,神犇轻喷- -
#include<cstdio> #include<iostream> #include<cstdlib> #define mid (l+r>>1) using namespace std; typedef int arr[1001000]; arr lc,rc,same; struct Data{int l,r,cnt;}data[1001000];//Left color,Right Color,count of Colors. int tree,tot; int n,m; inline void read(int &x){ x=0; bool f=false; char ch=getchar(); while((ch<'0'||ch>'9')&&ch!=-1) { if(ch=='-') f=true;ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-48; ch=getchar(); } if(f) x=-x; } inline Data merge(const Data &a,const Data &b){ return (Data){a.l,b.r,a.cnt+b.cnt-(a.r==b.l)}; } inline void update(int x){ data[x]=merge(data[lc[x]],data[rc[x]]); if(same[lc[x]]&&same[lc[x]]==same[rc[x]]) same[x]=same[lc[x]]; else same[x]=0; } void build(int &x,int l,int r){ x=++tot; if(l+1<r){ build(lc[x],l,mid); build(rc[x],mid,r); update(x); } else{ data[x].cnt=1; read(data[x].l); data[x].r=data[x].l; same[x]=data[x].l; // same[x]= } } void pushdown(int x){ if(same[x]){ data[lc[x]].l=data[lc[x]].r= data[rc[x]].l=data[rc[x]].r=same[x]; data[lc[x]].cnt=data[rc[x]].cnt=1;//FUCK!!!!! same[lc[x]]=same[rc[x]]=same[x]; }//data[lc[x]].cnt=data[lc[x]].cnt=1; } void paint(int x,int l,int r,int L,int R,int c){ if(L<=l&&r<=R){ data[x].l=data[x].r=c; data[x].cnt=1; same[x]=c; } else{ pushdown(x); if(L<mid) paint(lc[x],l,mid,L,R,c); if(R>mid) paint(rc[x],mid,r,L,R,c); update(x); } } Data query(int x,int l,int r,int L,int R){ // if(!x) exit(-1); if(L<=l&&r<=R) return data[x]; pushdown(x);//我发现好像只有纯色时 才需要向下更新- - if(R<=mid) return query(lc[x],l,mid,L,R); if(L>=mid) return query(rc[x],mid,r,L,R); return merge(query(lc[x],l,mid,L,R),query(rc[x],mid,r,L,R)); } int calc(int x,int begin,bool flip){ if(!flip) return ((begin+x-1)%n+n)%n; return ((begin-x+1)%n+n)%n; } int main(){ //freopen("input.in","r",stdin); int begin=0,q,x,i,j,colorCount; bool flip=false; Data tmp1,tmp2; char cmd[5]; read(n); read(colorCount); build(tree,0,n); read(q); while(q--){ scanf("%s",cmd); switch(cmd[0]){ case 'R':read(x); if(!flip)begin=((begin-x)+n)%n; else begin=(begin+x)%n; break; case 'F':flip^=1;break; case 'S': read(i); read(j); i=calc(i,begin,flip); j=calc(j,begin,flip); tmp1=query(1,0,n,i,i+1); tmp2=query(1,0,n,j,j+1); paint(1,0,n,j,j+1,tmp1.l); paint(1,0,n,i,i+1,tmp2.l); break; case 'P': read(i); read(j); read(x); i=calc(i,begin,flip); j=calc(j,begin,flip); // cout<<"in fact,i="<<i<<",and j="<<j<<"\n"; if(!flip){ if(i>j){ paint(1,0,n,0,j+1,x); paint(1,0,n,i,n,x); } else paint(1,0,n,i,j+1,x); } else{ if(i<j){ paint(1,0,n,0,i+1,x); paint(1,0,n,j,n,x); } else paint(1,0,n,j,i+1,x); } break; case 'C': if(cmd[1]=='S'){ read(i);read(j); i=calc(i,begin,flip); j=calc(j,begin,flip); // cout<<"begin="<<begin<<"\n"; // cout<<"in fact,i="<<i<<",and j="<<j<<"\n"; if(!flip){ if(i>j){ tmp1=query(1,0,n,0,j+1); tmp2=query(1,0,n,i,n); // printf("%d,%d,%d,%d\n",tmp1.l,tmp2.r,tmp1.cnt,tmp2.cnt); printf("%d\n",tmp1.cnt+tmp2.cnt-(tmp1.l==tmp2.r)); } else printf("%d\n",query(1,0,n,i,j+1).cnt); } else{ if(i<j){ tmp1=query(1,0,n,0,i+1); tmp2=query(1,0,n,j,n); printf("%d\n",tmp1.cnt+tmp2.cnt-(tmp1.l==tmp2.r)); } else printf("%d\n",query(1,0,n,j,i+1).cnt); } } else printf("%d\n",max(data[1].cnt-(data[1].l==data[1].r),1)); break; } } return 0; }
相关文章推荐
- [bzoj1493]1493: [NOI2007]项链工厂 线段树
- bzoj 1493 [NOI2007]项链工厂 线段树
- 【BZOJ】1493 [NOI2007]项链工厂 线段树
- [BZOJ]1493 [NOI2007]项链工厂 线段树
- bzoj 1493: [NOI2007]项链工厂(线段树)
- bzoj1493[NOI2007]项链工厂 线段树
- 【BZOJ1493】项链工厂(线段树)
- 【BZOJ1493】项链工厂(线段树)
- [BZOJ1493][NOI2007]项链工厂(splay)
- BZOJ1493 : [NOI2007]项链工厂
- BZOJ 1493 项链工厂(splay)
- BZOJ_1493_[NOI2007]项链工厂_Splay
- [bzoj1493] [NOI2007]项链工厂
- BZOJ 1493 NOI2007 项链工厂 Splay
- BZOJ 1493 NOI 2007 项链工厂 Splay
- [BZOJ1493][NOI2007]项链工厂
- BZOJ1493 NOI2007 项链工厂 线段树模拟
- BZOJ1493: [NOI2007]项链工厂 Splay
- noi 2007 项链工厂 (bzoj 1493)
- bzoj 1493: [NOI2007]项链工厂 (平衡树)