zoj 1610 Count the Colors

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=610

先用线段树维护区间颜色的覆盖,然后在把区间的颜色映射到数组,再从数组统计颜色。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #define maxn 100000
  5 using namespace std;
  6 
  7 int n;
  8 int min1;
  9 struct node1
 10 {
 11     int x1,x2,c;
 12 }p[maxn];
 13 struct node
 14 {
 15     int l,r;
 16     int cover;
 17 }tree[maxn*4];
 18 int vis[maxn];
 19 int colo[maxn];
 20 
 21 
 22 void build(int i,int l,int r)
 23 {
 24     tree[i].l=l; tree[i].r=r;
 25     tree[i].cover=-1;
 26     if(l==r) return ;
 27     int mid=(l+r)>>1;
 28     build(i<<1,l,mid);
 29     build(i<<1|1,mid+1,r);
 30 }
 31 void down(int i)
 32 {
 33     if(tree[i].l==tree[i].r) return ;
 34     if(tree[i].cover!=-1)
 35     {
 36         tree[i<<1].cover=tree[i<<1|1].cover=tree[i].cover;
 37         tree[i].cover=-1;
 38     }
 39 }
 40 void update(int i,int l,int r,int col)
 41 {
 42     if(tree[i].l==l&&tree[i].r==r)
 43     {
 44         tree[i].cover=col;
 45         return ;
 46     }
 47     down(i);
 48     int mid=(tree[i].l+tree[i].r)>>1;
 49     if(r<=mid)
 50     {
 51         update(i<<1,l,r,col);
 52     }
 53     else if(l>mid)
 54     {
 55         update(i<<1|1,l,r,col);
 56     }
 57     else
 58     {
 59         update(i<<1,l,mid,col);
 60         update(i<<1|1,mid+1,r,col);
 61     }
 62 }
 63 
 64 void search1(int i)
 65 {
 66     if(tree[i].cover!=-1)
 67     {
 68          for(int k=tree[i].l; k<=tree[i].r; k++)
 69          {
 70              vis[k]=tree[i].cover;
 71          }
 72          return ;
 73     }
 74     if(tree[i].l==tree[i].r) return;
 75     search1(i<<1);
 76     search1(i<<1|1);
 77 }
 78 
 79 int main()
 80 {
 81     while(scanf("%d",&n)!=EOF)
 82     {
 83         int max1=0,max2=-1;
 84         min1=maxn;
 85         for(int i=1; i<=n; i++)
 86         {
 87             scanf("%d%d%d",&p[i].x1,&p[i].x2,&p[i].c);
 88             max1=max(max1,p[i].x2);
 89             max2=max(max2,p[i].c);
 90             min1=min(min1,p[i].c);
 91         }
 92         build(1,0,max1*2-1);
 93         for(int i=0; i<=max1*2; i++)
 94         {
 95             vis[i]=-1;
 96         }
 97         for(int i=1; i<=n; i++)
 98         {
 99             update(1,p[i].x1*2,p[i].x2*2-1,p[i].c);
100         }
101         search1(1);
102         memset(colo,0,sizeof(colo));
103         for(int i=0; i<=max1*2; i++)
104         {
105             if(vis[i]!=-1)
106             {
107                 int mm=vis[i];
108                 colo[mm]++;
109                 while(vis[i]==mm&&i<=max1*2) i++;
110             }
111         }
112         for(int i=min1; i<=max2; i++)
113         {
114             if(colo[i])
115             {
116                 printf("%d %d\n",i,colo[i]);
117             }
118         }
119         printf("\n");
120     }
121     return 0;
122 }
View Code

 

posted @ 2014-08-15 21:06  null1019  阅读(156)  评论(0编辑  收藏  举报