• poj2482 Stars in Your Window


    此题可用线段树或静态二叉树来做。

    考虑用线段树:

    很容易想到先限定矩形横轴范围再考虑在此纵轴上矩形内物品总价值的最大值。

    那么枚举矩形横轴的复杂度是O(n)的,考虑如何快速获取纵轴上的最大值。

    我们不可能再次枚举纵轴,依次统计,这样做事多余的。

    考虑窗口在纵轴上的滑动,每上升到一个新的高度,在加入新元素的同时只需将最底层的那些值弹出队列即可。

    这样我们需要考虑队列上元素和的最大值。

    我们从反面考虑每个元素对特定队列(矩形纵轴位置)的贡献。

    枚举窗口的上面一条边,那么元素对窗口贡献正值当且仅当H(element) < H(window_top) - b。

    否则对窗口贡献0。

    注意到变化是连续的,考虑统计所有高度不超过枚举高度的物品总价值减去那些高度低于窗口下端的物品总价值。

    这样我们可以对每个点辅助构造一个对应的虚拟点,位置恰在该点上方b处,权值为是原点的相反数。

    于是队列和的最大值变成统计前缀最大值。

    y轴上离散化用线段是维护即可,x轴控制进出队。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 const int maxn = 1e5 + 10;
     6 typedef __int64 LL;
     7 struct Seg{
     8     LL l, r;
     9     LL sum, maxl;
    10 }seg[maxn << 3];
    11 LL n, a, b;
    12 LL k;
    13 LL base, len;
    14 struct Point{
    15     LL x, y, z;
    16     Point(LL x = 0, LL y = 0, LL z = 0) : x(x), y(y), z(z) {}
    17 }t[maxn << 1];
    18 
    19 bool cmp1(Point a, Point b){
    20     return a.y < b.y;
    21 }
    22 
    23 bool cmp2(Point a, Point b){
    24     return a.x < b.x;
    25 }
    26 
    27 void build(LL u, LL l, LL r){
    28     seg[u].l = l, seg[u].r = r;
    29     seg[u].maxl = seg[u].sum = 0;
    30     if(r - l < 2) return;
    31     LL mid = (l + r) >> 1;
    32     build(u << 1, l, mid);
    33     build(u << 1 | 1, mid, r);
    34 }
    35 
    36 void push_up(LL u){
    37     seg[u].sum = seg[u << 1].sum + seg[u << 1 | 1].sum;
    38     seg[u].maxl = max(seg[u << 1].maxl, seg[u << 1].sum + seg[u << 1 | 1].maxl);
    39 }
    40 
    41 void add(LL u, LL l, LL r, LL L, LL R, LL from, LL d){
    42     if(l == L && r == R){
    43         seg[u].maxl += d * t[from].z;
    44         seg[u].sum += d * t[from].z;
    45         return;
    46     }
    47     LL mid = (l + r) >> 1;
    48     if(R <= mid) add(u << 1, l, mid, L, R, from, d);
    49     else if(L >= mid) add(u << 1 | 1, mid, r, L, R, from, d);
    50     push_up(u);
    51 }
    52 
    53 int main(){
    54     //freopen("in.txt", "r", stdin);
    55     while(~scanf("%I64d%I64d%I64d", &n, &a, &b)){
    56         for(LL i = 1, x, y, z; i <= n; i++){
    57             scanf("%I64d%I64d%I64d", &x, &y, &z);
    58             t[i] = Point(x, y, z);
    59             t[i + n] = Point(x, y + b, -z);
    60         }
    61         len = n << 1;
    62         sort(t + 1, t + len + 1, cmp1);
    63         base = t[1].y;
    64         t[1].y = 1;
    65         for(LL i = 2; i <= len; i++){
    66             if(t[i].y == base) t[i].y = t[i - 1].y;
    67             else{
    68                 base = t[i].y;
    69                 t[i].y = t[i - 1].y + 1;
    70             }
    71         }
    72         LL high = t[len].y;
    73         sort(t + 1, t + len + 1, cmp2);
    74         base = 1;
    75         while(base <= len && t[base].x - t[1].x < a) ++base;
    76         build(1, 1, high + 1);
    77         for(LL i = 1; i < base; i++) add(1, 1, high + 1, t[i].y, t[i].y + 1, i, 1);
    78         LL ans = seg[1].maxl;
    79         LL pre = 1;
    80         for(LL i = base; i < len + 1; i++){
    81             LL tp = pre;
    82             while(tp < len + 1 && t[i].x - t[tp].x >= a) ++tp;
    83             for(LL j = pre; j < tp; j++) add(1, 1, high + 1, t[j].y, t[j].y + 1, j, -1);
    84             LL tem = i;
    85             while(i < len && t[i + 1].x == t[i].x) ++i;
    86             for(LL j = tem; j <= i; j++) add(1, 1, high + 1, t[j].y, t[j].y + 1, j, 1);
    87             ans = max(ans, seg[1].maxl);
    88             pre = tp;
    89         }
    90         printf("%I64d
    ", ans);
    91     }
    92     return 0;
    93 }
    View Code
  • 相关阅读:
    spring-102-spring全注解快速实现事务
    spring-101-springAOP
    spring-201-springmvc基于MappingJacksonValue 实现JSONP
    啥是JSONP---转
    request.getSession(boolean create)的正确使用姿势
    spring-003-Resource资源
    spring-002-Ioc bean配置
    spring-001-Ioc 顶层容器
    为企业提供免费代码安全扫描服务(每月限一次)
    圆满完成平安科技Web安全与App应用安全测试培训!
  • 原文地址:https://www.cnblogs.com/astoninfer/p/4862457.html
Copyright © 2020-2023  润新知