poj 2777 Count Color
2012-08-27 20:01
232 查看
区间染色,线段树。 #include<stdio.h> #include<string.h> struct node{ int l; int r; int col; }tree[400000]; int f[31]; char oper[2]; int len,t,o,a,b,d,ans; void build_tree(int i,int l,int r) { tree[i].l=l; tree[i].r=r; tree[i].col=1; if(tree[i].l==tree[i].r) { return; } int mid=(tree[i].l+tree[i].r)/2; build_tree(2*i,l,mid); build_tree(2*i+1,mid+1,r); } void updata(int i,int a,int b,int d) { if(tree[i].col==d) return; if(tree[i].l==a&&tree[i].r==b) { tree[i].col=d; return; } if(tree[i].col>0) { tree[2*i].col=tree[i].col; tree[2*i+1].col=tree[i].col; tree[i].col=0; } int mid=(tree[i].l+tree[i].r)/2; if(b<=mid) updata(2*i,a,b,d); else if (a>=mid+1) updata(2*i+1,a,b,d); else{ updata(2*i,a,mid,d); updata(2*i+1,mid+1,b,d); } } void qurry(int i,int a,int b) { if(tree[i].col>0) { f[tree[i].col]=1; return; } int mid=(tree[i].l+tree[i].r)/2; if(b<=mid) qurry(2*i,a,b); else if(a>=mid+1) qurry(2*i+1,a,b); else{ qurry(2*i,a,mid); qurry(2*i+1,mid+1,b); } } int main() { while(scanf("%d%d%d",&len,&t,&o)!=EOF) { build_tree(1,1,len); for(int i=0;i<o;i++) { scanf("%s",oper); if(oper[0]=='C') { scanf("%d%d%d",&a,&b,&d); updata(1,a,b,d); } else { memset(f,0,sizeof(f)); ans=0; scanf("%d%d",&a,&b); qurry(1,a,b); for(int j=1;j<=t;j++) if(f[j]) ans++; printf("%d\n",ans); } } } return 0; }
相关文章推荐
- POJ 2777-Count Color-(线段树)
- poj 2777 Count Color
- POJ 2777 Count Color
- POJ 2777 Count Color——区间更新的线段树+状态压缩
- POJ 2777 Count Color
- POJ 2777--Count Color(线段树)
- POJ 2777 Count Color(线段树、lazy思想)
- POJ 2777 Count Color (线段树区间更新 位压缩)
- POJ 2777 Count Color
- POJ 2777 Count Color(线段树之成段更新)
- POJ 2777 Count Color(线段树)
- poj 2777 Count Color
- Poj 2777 Count Color(线段树基础)
- POJ 2777 Count Color (线段树)
- poj 2777 Count Color(位运算+线段树区间更新 可用bitset记录)
- POJ 2777 Count Color 线段树 区间更新
- POJ 2777 Count Color(线段树+二进制位运算)
- POJ 2777Count Color (线段树区间更新 + 位运算压缩)
- POJ 2777 Count Color
- HOJ 2685 POJ 2777 Count Color