• 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
  • 相关阅读:
    SpringBoot使用SpringSession和redis解决session共享问题(nginx反向代理)
    centos7中安装和配置nginx和keepalived
    定位
    css
    css美化
    html5
    列表,表格,媒体元素
    表单
    一期测试错题修改
    字符串
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3915674.html
Copyright © 2020-2023  润新知