POJ 2777 Count Color【线段染色】
2012-08-08 20:10
232 查看
题意: 有一个有 N 个区间木板,存在最多 30 种颜色,一开始木板的颜色都为第一种颜色。
定义两种操作:
C x y c 将区间[x,y]涂成 c 颜色。
P x y 询问区间[x,y]共有多少种颜色。
分析: 比较典型的成段更新的线段树染色问题,使用延迟标记数组。
定义两种操作:
C x y c 将区间[x,y]涂成 c 颜色。
P x y 询问区间[x,y]共有多少种颜色。
分析: 比较典型的成段更新的线段树染色问题,使用延迟标记数组。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) #define maxn 100005 int col[maxn<<3]; int v[33]; void creat(int l,int r,int rt) { col[rt]=1; if(l==r) return; int m=(l+r)>>1; creat(l,m,rt<<1); creat(m+1,r,rt<<1|1); } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R) { col[rt]=c; return; } if(col[rt]==c) return; if(col[rt]) { col[rt<<1]=col[rt]; col[rt<<1|1]=col[rt]; col[rt]=0; } int m=(l+r)>>1; if(L<=m) update(L,R,c,l,m,rt<<1); if(R>m) update(L,R,c,m+1,r,rt<<1|1); } void query(int L,int R,int l,int r,int rt) { if(col[rt]) { v[col[rt]]=1; return; } int m=(l+r)>>1; if(L<=m) query(L,R,l,m,rt<<1); if(R>m) query(L,R,m+1,r,rt<<1|1); } int main() { int n,t,m,a,b,c,i,tot; char s[2]; while(scanf("%d%d%d",&n,&t,&m)!=EOF) { creat(1,n,1); while(m--) { scanf("%s",s); if(s[0]=='C') { scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,n,1); } else { scanf("%d%d",&a,&b); clr(v); tot=0; query(a,b,1,n,1); for(i=1;i<=30;i++) if(v[i]) tot++; printf("%d\n",tot); } } } 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(线段树,区间染色+简单hash)
- 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 线段树 线段染色 基础题
- POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
- POJ-2777 Count Color(线段树,区间染色问题)
- POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
- POJ-2777 Count Color(线段树,区间染色问题)
- hdu 5023 && poj 2777(线段染色)2014 ACM/ICPC Asia Regional 广州 Online