poj 2777 Count Color
2013-08-04 18:54
218 查看
链接:点击打开链接
两种操作,C A B C是A到B中涂颜色C,P A B 是A到B区间有几种颜色。成段更新。需要注意的是这里没讲A一定大于B。
两种操作,C A B C是A到B中涂颜色C,P A B 是A到B区间有几种颜色。成段更新。需要注意的是这里没讲A一定大于B。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100010 struct node{ int l; int r; int c; }anode[4*N]; int vis[33],ans; void bulid(int l,int r,int n){ anode .l=l; anode .r=r; anode .c=1; int mid=(l+r)>>1; if(l==r) return; bulid(l,mid,2*n); bulid(mid+1,r,2*n+1); } void update(int l,int r,int n,int c){ if(anode .l==l&&anode .r==r){ anode .c=c; return; } if(anode .c>0){ anode[2*n].c=anode[2*n+1].c=anode .c; anode .c=0; } int mid=(anode .l+anode .r)>>1; if(r<=mid) update(l,r,2*n,c); else if(l>mid) update(l,r,2*n+1,c); else{ update(l,mid,2*n,c); update(mid+1,r,2*n+1,c); } } void query(int l,int r,int n){ if(anode .c!=0){ if(!vis[anode .c]){ ans++; vis[anode .c]=1; } return; } int mid=(anode .l+anode .r)>>1; if(r<=mid) query(l,r,2*n); else if(l>mid) query(l,r,2*n+1); else{ query(l,mid,2*n); query(mid+1,r,2*n+1); } } int main(){ int L,T,O,a,b,c; char str; while(~scanf("%d %d %d",&L,&T,&O)){ bulid(1,L,1); while(O--){ getchar(); scanf("%c",&str); if(str=='C'){ scanf("%d %d %d",&a,&b,&c); if(a>b) swap(a,b); update(a,b,1,c); } else{ scanf("%d %d",&a,&b); if(a>b) swap(a,b); ans=0; memset(vis,0,sizeof(vis)); query(a,b,1); 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 线段树
- 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
- poj 2777 Count Color
- 线段树区间更新,区间统计 poj 2777 Count Color
- poj 2777 Count Color 线段树
- POJ---2777 Count Color[线段树-求整段区间]
- poj 2777 Count Color(线段树区区+染色问题)