zoukankan      html  css  js  c++  java
  • POJ 2482 Stars in Your Window(线段树+扫描线)

    题目链接

    非常不容易的一道题,把每个点向右上构造一个矩形,将问题转化为重合矩形那个亮度最大,注意LL,注意排序。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <string>
      4 #include <algorithm>
      5 using namespace std;
      6 #define maxn 50100
      7 #define lson l,m,rt<<1
      8 #define rson m+1,r,rt<<1|1
      9 #define LL __int64
     10 struct node
     11 {
     12     LL lx,rx,y;
     13     LL s;
     14     node(){}
     15     node(LL a,LL b,LL c,LL d):lx(a),rx(b),y(c),s(d){}
     16     bool operator < (const node &S) const
     17     {
     18         if(y == S.y)
     19         return s > S.s;
     20         else
     21         return y < S.y;
     22     }
     23 }mat[maxn];
     24 LL que[2*maxn];
     25 LL tree[4*maxn];
     26 LL lz[4*maxn];
     27 void pushup(int rt)
     28 {
     29     tree[rt] = max(tree[rt<<1],tree[rt<<1|1]);
     30 }
     31 void pushdown(int rt)
     32 {
     33     if(lz[rt])
     34     {
     35         lz[rt<<1] += lz[rt];
     36         lz[rt<<1|1] += lz[rt];
     37         tree[rt<<1] += lz[rt];
     38         tree[rt<<1|1] += lz[rt];
     39         lz[rt] = 0;
     40     }
     41 }
     42 void update(int L,int R,int c,int l,int r,int rt)
     43 {
     44     int m;
     45     if(L <= l&&r <= R)
     46     {
     47         tree[rt] += c;
     48         lz[rt] += c;
     49         return ;
     50     }
     51     pushdown(rt);
     52     m = (l+r)>>1;
     53     if(L <= m)
     54     update(L,R,c,lson);
     55     if(R > m)
     56     update(L,R,c,rson);
     57     pushup(rt);
     58 }
     59 int bin(LL x,int n)
     60 {
     61     int str,mid,end;
     62     str = 0;
     63     end = n;
     64     while(str <= end)
     65     {
     66         mid = (str+end)/2;
     67         if(que[mid] == x)
     68         return mid;
     69         else if(que[mid] > x)
     70         end = mid - 1;
     71         else
     72         str = mid + 1;
     73     }
     74     return mid;
     75 }
     76 int main()
     77 {
     78     int n,num,k,i;
     79     LL a,b,c,h,w;
     80     while(scanf("%d%I64d%I64d",&n,&w,&h)!=EOF)
     81     {
     82         num = 0;
     83         w--;
     84         h--;
     85         for(i = 0;i < n;i ++)
     86         {
     87             scanf("%I64d%I64d%I64d",&a,&b,&c);
     88             mat[num] = node(a,a+w,b,c);
     89             que[num++] = a;
     90             mat[num] = node(a,a+w,b+h,-c);
     91             que[num++] = a+w;
     92         }
     93         k = 1;
     94         sort(que,que+num);
     95         sort(mat,mat+num);
     96         for(i = 1;i < num;i ++)
     97         {
     98             if(que[i] != que[i-1])
     99             que[k++] = que[i];
    100         }
    101         LL maxz = 0;
    102         memset(tree,0,sizeof(tree));
    103         memset(lz,0,sizeof(lz));
    104         for(i = 0;i < num;i ++)
    105         {
    106             int l = bin(mat[i].lx,k-1);
    107             int r = bin(mat[i].rx,k-1);
    108             if(l <= r) update(l,r,mat[i].s,0,k-1,1);
    109             maxz = max(maxz,tree[1]);
    110         }
    111         printf("%I64d
    ",maxz);
    112     }
    113     return 0;
    114 }
  • 相关阅读:
    getBoundingClientRect()方法
    Sublime Text3 安装less
    less知识点总结(一)
    跨域知识(二)——JSONP
    面向过程和面向对象的区别(转)
    暴力+DP:买卖股票的最佳时机
    车的可用捕获量(3.26leetcode每日打卡)
    三维形体的表面积(3.25leetcode每日打卡)
    基础练习:FJ的字符串
    DP:打家劫舍
  • 原文地址:https://www.cnblogs.com/naix-x/p/3147075.html
Copyright © 2011-2022 走看看