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 }

 

posted @ 2013-08-11 11:19  Naix_x  阅读(233)  评论(0)    收藏  举报