• pku3277 City Horizon


    http://poj.org/problem?id=3277

    线段树,离散化,成段更新

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #define lson l, m, root<<1
      5 #define rson m+1, r, root<<1|1
      6 
      7 const long long N = 80080;
      8 const long long inf = (1<<31)-1;
      9 
     10 long long max1[N<<2], color[N<<2];
     11 
     12 long long max(long long x, long long y)
     13 {
     14     return x>y? x: y;
     15 }
     16 
     17 void push_up(long long root)
     18 {
     19     max1[root] = max(max1[root<<1], max1[root<<1|1]);
     20 }
     21 
     22 void push_down(long long l, long long r, long long root)
     23 {
     24     color[root<<1] = max(color[root<<1], color[root]);
     25     color[root<<1|1] = max(color[root<<1|1], color[root]);
     26     color[root] = -1;
     27     max1[root<<1] = max(max1[root<<1], color[root<<1]);
     28     max1[root<<1|1] = max(max1[root<<1|1], color[root<<1|1]);
     29 }
     30 
     31 void build(long long l, long long r, long long root)
     32 {
     33     long long m;
     34     color[root] = -1;
     35     if(l == r)
     36     {
     37         max1[root] = 0;
     38         return;
     39     }
     40     m = (l + r) >> 1;
     41     build(lson);
     42     build(rson);
     43     push_up(root);
     44 }
     45 
     46 void update(long long L, long long R, long long x, long long l, long long r, long long root)
     47 {
     48     long long m;
     49     if(L <= l && r <= R)
     50     {
     51         color[root] = max(color[root], x);
     52         max1[root] = max(max1[root], color[root]);
     53         return;
     54     }
     55     m = (l + r) >> 1;
     56     if(color[root] != -1)
     57     {
     58         push_down(l, r, root);
     59     }
     60     if(L <= m)
     61     {
     62         update(L, R, x, lson);
     63     }
     64     if(m+1 <= R)
     65     {
     66         update(L, R, x, rson);
     67     }
     68     push_up(root);
     69 }
     70 
     71 long long query(long long L, long long R, long long l, long long r, long long root)
     72 {
     73     long long m, result = 0;
     74     if(L <= l && r <= R)
     75     {
     76         return max1[root];
     77     }
     78     m = (l + r) >> 1;
     79     if(color[root] != -1)
     80     {
     81         push_down(l, r, root);
     82     }
     83     if(L <= m)
     84     {
     85         result = max(result, query(L, R, lson));
     86     }
     87     if(m+1 <= R)
     88     {
     89         result = max(result, query(L, R, rson));
     90     }
     91     push_up(root);
     92     return result;
     93 }
     94 
     95 struct B
     96 {
     97     long long x, y;
     98     long long h;
     99 }b[N>>1];
    100 
    101 long long a[N], hash[N];
    102 
    103 long long bs(long long l, long long r, long long x)
    104 {
    105     long long m;
    106     while(l < r)
    107     {
    108         m = (l + r) >> 1;
    109         if(hash[m] == x)
    110         {
    111             return m;
    112         }
    113         if(hash[m] < x)
    114         {
    115             l = m + 1;
    116         }
    117         else
    118         {
    119             r = m;
    120         }
    121     }
    122 }
    123 
    124 int cmp0(const void *a, const void *b)
    125 {
    126     return *(long long *)a - *(long long *)b;
    127 }
    128 
    129 int main()
    130 {
    131     long long n, i, j, temp, result = 0;
    132     long long k;
    133     scanf("%lld", &n);
    134     for(i=1; i<=n; i++)
    135     {
    136         scanf("%lld%lld%lld", &b[i].x, &b[i].y, &b[i].h);
    137         a[(i-1)*2+1] = b[i].x;
    138         a[(i-1)*2+2] = b[i].y;
    139     }
    140     qsort(a+1, 2*n, sizeof(a[0]), cmp0);
    141     j = 1;
    142     hash[j] = a[1];
    143     for(i=2; i<=2*n; i++)
    144     {
    145         if(a[i] != a[i-1])
    146         {
    147             j = j + 1;
    148             hash[j] = a[i];
    149         }
    150     }
    151 //    for(i=1; i<=j; i++)
    152 //    {
    153 //        printf("%5d", i);
    154 //    }
    155 //    printf("
    ");
    156 //    for(i=1; i<=j; i++)
    157 //    {
    158 //        printf("%5d", hash[i]);
    159 //    }
    160 //    printf("
    ");
    161     build(1, j-1, 1);
    162     for(i=1; i<=n; i++)
    163     {
    164 //        printf("update %lld %lld %lld
    ", bs(1, j+1, b[i].x), bs(1, j+1, b[i].y)-1, b[i].h);
    165         update(bs(1, j+1, b[i].x), bs(1, j+1, b[i].y)-1, b[i].h, 1, j, 1);
    166 //        for(k=1; k<=j-1; k++)
    167 //        {
    168 //            printf("%4d", k);
    169 //        }
    170 //        printf("
    ");
    171 //        for(k=1; k<=j-1; k++)
    172 //        {
    173 //            temp = query(k, k, 1, j, 1);
    174 //            result += (temp * (hash[k+1]-hash[k]));
    175 //            printf("%4d", temp);
    176 //        }
    177 //        printf("
    ");
    178     }
    179     result = 0;
    180     for(i=1; i<=j-1; i++)
    181     {
    182         temp = query(i, i, 1, j, 1);
    183         result += (temp * (hash[i+1]-hash[i]));
    184 //        printf("%lld %lld %lld
    ", i, temp, hash[i+1]-hash[i]);
    185     }
    186     printf("%lld
    ", result);
    187     return 0;
    188 }
  • 相关阅读:
    Win8.1恢复被禁用虚拟WiFi适配器的方法
    VM虚拟机安装AndroidX86版
    (转)java 调用webservice的各种方法总结
    在虚拟机中配置FastDFS+Nginx模块
    Nodejs&express+mongodb完成简单用户登录(即Nodejs入门)
    C# WPF 自学 MVVM简单介绍
    【ASP.NET Core】在CentOS上安装.NET Core运行时、部署到CentOS
    log4net 写入 mongodb+Mongodb记录日志
    MongoDB学习笔记
    使用druid 数据池对连接密码加密
  • 原文地址:https://www.cnblogs.com/yuan1991/p/pku3277.html
Copyright © 2020-2023  润新知