zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    个人项目(Word Count Java)
    自我介绍+软工5问
    第六次实践
    第五次实践作业
    第四次实践作业
    第三次实践作业
    第二次实践作业
    第1次实践作业
    第06组 Beta版本演示
    第06组 Beta冲刺(4/4)
  • 原文地址:https://www.cnblogs.com/naix-x/p/3251119.html
Copyright © 2011-2022 走看看