标签:pre ... make poj yellow and space time ++
Description
#include<cstdio> using namespace std; const int MAXN=100010; int tree[MAXN<<2]; int lz[MAXN<<2]; int n,t,o,L,R; void up(int ); void down(int ,int ,int ); void col(int ,int ,int ,int ); int ask(int ,int ,int ); int ans(int ); int main() { int i,j,k; char s[3]; scanf("%d%d%d",&n,&t,&o); lz[1]=1; tree[1]=1; for(i=1;i<=o;i++){ scanf("%s",s); if(s[0]==‘C‘){ scanf("%d%d%d",&L,&R,&j); if(L>=R) k=L,L=R,R=k; col(1,n,1,j); } else{ scanf("%d%d",&L,&R); if(L>=R) k=L,L=R,R=k; j=ask(1,n,1); printf("%d\n",ans(j)); } } } void up(int nu){ tree[nu]=tree[nu<<1]|tree[nu<<1|1]; } void down(int l,int r,int nu){ if(!lz[nu])return ; tree[nu<<1]=lz[nu]; tree[nu<<1|1]=lz[nu]; lz[nu<<1]=lz[nu<<1|1]=lz[nu]; lz[nu]=0; } void col(int l,int r,int nu,int x){ if(L<=l&&r<=R){ tree[nu]=lz[nu]=(1<<(x-1)); return ; } down(l,r,nu); int mid=(l+r)>>1; if(L<=mid) col(l,mid,nu<<1,x); if(R>mid) col(mid+1,r,nu<<1|1,x); up(nu); } int ask(int l,int r,int nu){ if(L<=l&&r<=R) return tree[nu]; down(l,r,nu); int ans=0,mid=(l+r)>>1; if(L<=mid) ans|=ask(l,mid,nu<<1); if(R>mid) ans|=ask(mid+1,r,nu<<1|1); return ans; } int ans(int x){ int re=0; while(x){ if(x&1) re++; x>>=1; } return re; }
POJ P2777 Count Color——线段树状态压缩
标签:pre ... make poj yellow and space time ++
原文地址:http://www.cnblogs.com/nietzsche-oier/p/6690794.html