POJ 3277 City Horizon(扫描线+线段树)

题目链接

类似求面积并。。2Y。。

  1 #include <cstdio>

  2 #include <cstring>

  3 #include <string>

  4 #include <cmath>

  5 #include <algorithm>

  6 using namespace std;

  7 #define LL __int64

  8 #define maxn 40100

  9 #define lson l , m, rt<<1

 10 #define rson m+1, r,rt<<1|1

 11 int que[maxn*4];

 12 int sum[maxn*4];

 13 int cnt[maxn*4];

 14 struct node

 15 {

 16     int x,y,s;

 17     node(){}

 18     node(int a,int b,int c):x(a),y(b),s(c){}

 19     bool operator < (const node &S)const

 20     {

 21         return x < S.x;

 22     }

 23 }mat[maxn*3];

 24 int bin(int x,int n)

 25 {

 26     int str,mid,end;

 27     str = 0;

 28     end = n;

 29     while(str <= end)

 30     {

 31         mid = (str+end)/2;

 32         if(que[mid] == x)

 33         return mid;

 34         else if(que[mid] > x)

 35         end = mid - 1;

 36         else

 37         str = mid + 1;

 38     }

 39     return mid;

 40 }

 41 void pushup(int rt,int l,int r)

 42 {

 43     if(cnt[rt])

 44     {

 45         sum[rt] = que[r+1] - que[l];

 46     }

 47     else if(l == r)

 48     sum[rt] = 0;

 49     else

 50     sum[rt] = sum[rt<<1] + sum[rt<<1|1];

 51 }

 52 void update(int L,int R,int c,int l,int r,int rt)

 53 {

 54     int m;

 55     if(l >= L&&r <= R)

 56     {

 57         cnt[rt] += c;

 58         pushup(rt,l,r);

 59         return ;

 60     }

 61     m = (l+r)>>1;

 62     if(L <= m) update(L,R,c,lson);

 63     if(R > m) update(L,R,c,rson);

 64     pushup(rt,l,r);

 65 }

 66 int main()

 67 {

 68     int n,a,b,c,i,k,num,l,r;

 69     while(scanf("%d",&n)!=EOF)

 70     {

 71         memset(cnt,0,sizeof(cnt));

 72         memset(sum,0,sizeof(sum));

 73         num = 0;

 74         for(i = 0;i < n;i ++)

 75         {

 76             scanf("%d%d%d",&a,&b,&c);

 77             que[num] = 0;

 78             mat[num++] = node(a,c,1);

 79             que[num] = c;

 80             mat[num++] = node(b,c,-1);

 81         }

 82         sort(mat,mat+num);

 83         sort(que,que+num);

 84         k = 1;

 85         for(i = 1;i < num;i ++)

 86         {

 87             if(que[k] != que[i])

 88             que[k++] = que[i];

 89         }

 90         LL ans = 0;

 91         for(i = 0;i < num-1;i ++)

 92         {

 93             l = 0;

 94             r = bin(mat[i].y,k-1)-1;

 95             if(l <= r)

 96             update(l,r,mat[i].s,0,k-1,1);

 97             ans = ans + (LL)sum[1]*(mat[i+1].x - mat[i].x);

 98         }

 99         printf("%I64d\n",ans);

100     }

101     return 0;

102 }

 

你可能感兴趣的:(poj)