sdutCity Horizon(离散化)

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2426

这题本来是按高度从大到小找的 要向上向下都得更新啊 结果TLE了 然后又从小到大排序

线段树+离散化 把对应的值开个数组存起来 最后算面积的时候 用离散前的值算 高度从小到大排好序更新 这样比较简单

View Code
  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<string.h>
  4 #include<algorithm>
  5 using namespace std;
  6 #define N 100001
  7 int num[N];
  8 struct mode
  9 {
 10     int po[2],h;
 11 }q[N*2];
 12 struct node
 13 {
 14     int li,da;
 15 }line[100001];
 16 long long s[N*4];
 17 bool cmp(mode x,mode y)
 18 {
 19     return x.h<y.h;
 20 }
 21 void build(int l,int r,int w)
 22 {
 23     s[w] = -1;
 24     if(l==r-1)
 25     {
 26         return ;
 27     }
 28     int m = (l+r)/2;
 29     build(l,m,2*w);
 30     build(m,r,2*w+1);
 31 }
 32 void add(int a,int b,int da,int l,int r,int w)
 33 {
 34     if(l==a&&b==r)
 35     {
 36         s[w] = da;
 37         return ;
 38     }
 39     int m = (l+r)/2;
 40     if(s[w]>0)
 41     {
 42         s[2*w] = s[w];
 43         s[2*w+1] = s[w];
 44         s[w] = -1;
 45     }
 46     if(b<=m)
 47         add(a,b,da,l,m,2*w);
 48     else
 49         if(a>=m)
 50             add(a,b,da,m,r,2*w+1);
 51         else
 52         {
 53             add(a,m,da,l,m,2*w);
 54             add(m,b,da,m,r,2*w+1);
 55         }
 56 }
 57 long long  search(int l,int r,int w)
 58 {
 59     if(s[w]>0)
 60     {
 61         long long  k = s[w];
 62         return (num[r]-num[l])*k;
 63     }
 64     if(l==r-1)
 65         return 0;
 66     int m = (l+r)/2;
 67     long long  re =0 ;
 68     re+=search(l,m,2*w);
 69     re+=search(m,r,2*w+1);
 70     return re;
 71 }
 72 bool cmpp(node a,node b)
 73 {
 74     return a.da<b.da;
 75 }
 76 int main()
 77 {
 78     int i,j,k,n,m;
 79     long long  s;
 80     while(scanf("%d", &n)!=EOF)
 81     {
 82         build(1,N,1);
 83         s = 0;
 84         for(i = 0; i < n ; i++)
 85         {
 86             scanf("%d%d%d", &q[i].po[0],&q[i].po[1],&q[i+1].h);
 87             line[2*i].li = i+1;
 88             line[2*i].da = q[i].po[0];
 89             line[2*i+1].li = -(i+1);
 90             line[2*i+1].da = q[i].po[1];
 91         }
 92         sort(line,line+2*n,cmpp);
 93         int te = line[0].da,g = 1;
 94         for(i = 0 ; i < 2*n ; i++)
 95         {
 96             if(te!=line[i].da)
 97             {
 98                 te = line[i].da;
 99                 g++;
100             }
101             if(line[i].li>0)
102             {
103                 num[g] = line[i].da;
104                 q[line[i].li].po[0] = g;
105             }
106             else
107             {
108                 num[g] = line[i].da;
109                 q[-line[i].li].po[1] =g;
110             }
111         }
112         sort(q+1,q+n+1,cmp);
113         for(i = 1; i<= n ; i++)
114             add(q[i].po[0],q[i].po[1],q[i].h,1,N,1);
115         s = search(1,N,1);
116         printf("%lld\n",s);
117     }
118     return 0;
119 }
原文地址:https://www.cnblogs.com/shangyu/p/2659972.html