题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6638

题意为在一个平面上任意选择一个长方形,使得长方形内点权和最大。

因为长方形可以任意选择,所以上下边一定在某些点上。所以可以枚举上下边。

将上下边看成一条直线y,上下边之间的点看成直线y上的点,则题意就转化成求直线y上最大子段和(子段和的左右边界即是长方形的左右边)。

用线段树维护(区间和&最大前缀和&最大后缀和)就可以维护得到区间最大子段和。

显然需要离散化(雾

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define lson l, mid, i << 1
#define rson mid + 1, r, i << 1 | 1
using namespace std;
typedef long long ll;
const int maxn = + ;
struct node {
ll sum, max_sum, max_q, max_h;//区间和,区间最大子段和,最大前缀和,最大后缀和。
}T[maxn * ];
struct P {
int x, y;
ll w;
}p[maxn];
int x[maxn], y[maxn];
bool cmp(P a, P b) {
if (a.y == b.y)
return a.x < b.x;
return a.y < b.y;
}
void up(int i) {
T[i].sum = T[i << ].sum + T[i << | ].sum;
T[i].max_sum = max(T[i << | ].max_q + T[i << ].max_h, max(T[i << ].max_sum, T[i << | ].max_sum));
T[i].max_q = max(T[i << ].max_q, T[i << ].sum + T[i << | ].max_q);
T[i].max_h = max(T[i << | ].max_h, T[i << ].max_h + T[i << | ].sum);
}
void build(int l, int r, int i) {
T[i].sum = T[i].max_sum = T[i].max_q = T[i].max_h = ;
if (l == r)
return;
int mid = l + r >> ;
build(lson);
build(rson);
}
void update(int pos, int w, int l, int r, int i) {
if (l == r) {
T[i].sum += w;
T[i].max_sum = T[i].max_q = T[i].max_h = T[i].sum;
return;
}
int mid = l + r >> ;
if (pos <= mid)
update(pos, w, lson);
else
update(pos, w, rson);
up(i);
}
ll f[maxn];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n;
ll ans = ;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d%d%lld", &p[i].x, &p[i].y, &p[i].w);
x[i] = p[i].x, y[i] = p[i].y;
}
sort(x + , x + + n);
sort(y + , y + + n);
int xx = unique(x + , x + + n) - x - , yy = unique(y + , y + + n) - y - ;
for (int i = ; i <= n; i++) {
p[i].x = lower_bound(x + , x + + xx, p[i].x) - x;
p[i].y = lower_bound(y + , y + + yy, p[i].y) - y;
}
sort(p + , p + + n, cmp);
int now = ;
for (int i = ; i <= yy; i++) {
build(, xx, );
for (int j = i, k = now; j <= yy; j++) {
while (k <= n && p[k].y == j) {
update(p[k].x, p[k].w, , xx, );
k++;
}
if (j == i)
now = k;
ans = max(ans, T[].max_sum);
}
}
printf("%lld\n", ans);
}
}

[2019杭电多校第六场][hdu6638]Snowy Smile(维护区间最大子段和)的更多相关文章

  1. 2019杭电多校第六场hdu6638 Snowy Smile(线段树+枚举)

    Snowy Smile 题目传送门 解题思路 先把y离散化,然后把点按照x的大小进行排序,我们枚举每一种x作为上边界,然后再枚举其对应的每一种下边界.按照这种顺序插入点,这是一个压维的操作,即在线段树 ...

  2. [2019杭电多校第六场][hdu6641]TDL

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6641 题意为求出最小的n,满足(f(n,m)-n)^n=k,其中f(n,m)为第m大的x,其中x满足g ...

  3. [2019杭电多校第六场][hdu6635]Nonsense Time

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6635 题意是说一开始所有数都冻结,第i秒会解冻第ki个数,求每秒状态下的最长上上升子序列长度. 这种题 ...

  4. 2018杭电多校第六场1009(DFS,思维)

    #include<bits/stdc++.h>using namespace std;int a[100010];char s[20];int zhiren[100010];vector& ...

  5. 2017杭电多校第六场1008 Kirinriki

    传送门 Kirinriki Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  6. 2017杭电多校第六场1011Classes

    传送门 Classes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  7. 2017杭电多校第六场03Inversion

    传送门 Inversion Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  8. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望

    题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...

  9. 2019 杭电多校第八场 HDU - 6665 Calabash and Landlord 两矩形分平面

    题意 给出两个矩形,问这两个矩形把平面分成了几部分. 分析 不需要什么高级技能,只需 “简单” 的分类讨论. (实在太难写了,对拍找出错误都不想改 推荐博客,其中有个很好的思路,即只讨论答案为2,3, ...

随机推荐

  1. springboot 集成p6spy

    pom.xml <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifact ...

  2. Task7.手写数字识别

    用PyTorch完成手写数字识别 import numpy as np import torch from torch import nn, optim import torch.nn.functio ...

  3. linux运维、架构之路-redis集群

    一.介绍            redis cluster 3.0之后的功能,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了 ...

  4. Flink Forward Asia 2019 - 总结和展望(附PPT下载链接)

    11 月 28 - 30 日,北京迎来了入冬以来的第一场雪,2019 Flink Forward Asia(FFA)也在初雪的召唤下顺利拉开帷幕.尽管天气寒冷,FFA 实际到会人次超过 2000,同比 ...

  5. ASCII,Unicode,UTF-8

    ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英 ...

  6. 解决:未能加载文件或程序集“MiniProfiler”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配

    参考:https://www.lanhusoft.com/Article/120.html 产生的原因: 公司原来的项目用的是MiniProfiler 3.0.11新项目本来想使用4.0,但是无奈网上 ...

  7. 20180827-Java网络编程

    Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接 ...

  8. JAVA-IO模型(BIO,NIO,AIO)

    基本概念 阻塞和非阻塞 阻塞是进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待, 直到有东西可读或者可写为止 非阻塞是如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等 ...

  9. 查看windosw服务器型号和序列号

    查看服务器型号 wmic csproduct get name 查看序列号 wmic bios get serialnumber 查看内存 wmic memorychip list brief === ...

  10. docker容器挂载docker.sock,在容器内部直接与docker守护进程通信进行接口调用

    一.docker container实现 1.docker容器启动时挂载docker.sock docker run -it -- 2.curl调用接口 curl -s --unix-socket / ...