zoukankan      html  css  js  c++  java
  • 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
    ",i,colo[i]);
    117             }
    118         }
    119         printf("
    ");
    120     }
    121     return 0;
    122 }
    View Code
  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3915674.html
Copyright © 2011-2022 走看看