poj 2777 Count Color

来源:互联网 发布:淘宝助理5.8.3.0 编辑:程序博客网 时间:2024/04/29 18:14

第一道线段树 简单线段树

只要修改其插入操作即可

#include <iostream>#include <cstring>#define maxn 700000using namespace std;int n,t,o;bool vis[32];struct node{int left,right,mid,cover,f,color;}seg_tree[3*maxn];void make(int l,int r,int num){seg_tree[num].left=l;seg_tree[num].right=r;seg_tree[num].mid=(l+r)/2;seg_tree[num].color=1;if(l!=r){make(l,seg_tree[num].mid,2*num);make(seg_tree[num].mid+1,r,2*num+1);}}void update(int l,int r,int c,int num){if(seg_tree[num].left==l && seg_tree[num].right==r){seg_tree[num].color=c;return ;}if(seg_tree[num].color==c)return ;if(seg_tree[num].color!=-1){seg_tree[2*num].color=seg_tree[num].color;seg_tree[2*num+1].color=seg_tree[num].color;seg_tree[num].color=-1;}if(r<=seg_tree[num].mid)update(l,r,c,2*num);else if(l>seg_tree[num].mid)update(l,r,c,2*num+1);else{update(l,seg_tree[num].mid,c,2*num);update(seg_tree[num].mid+1,r,c,2*num+1);}}void query(int l,int r,int num){if(seg_tree[num].color!=-1){vis[seg_tree[num].color]=1;return ;}if(r<=seg_tree[num].mid)query(l,r,2*num);else if(l>seg_tree[num].mid)query(l,r,2*num+1);else{query(l,seg_tree[num].mid,2*num);query(seg_tree[num].mid+1,r,2*num+1);}}int main(){int i,j,cnt,a,b,c,tmp;char s[3];while(scanf("%d%d%d",&n,&t,&o)!=EOF){make(1,n,1);for(i=1;i<=o;i++){scanf("%s%d%d",s,&a,&b);if(a>b){tmp=a;a=b;b=tmp;}if(s[0]=='C'){scanf("%d",&c);update(a,b,c,1);}else{memset(vis,0,sizeof(vis));query(a,b,1);cnt=0;for(j=1;j<=30;j++)if(vis[j]==1)cnt++;printf("%d/n",cnt);}}}return 0;}


原创粉丝点击