题目链接: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. 谷歌将用QUIC传输层技术加速互联网

    安全这个话题,要感谢斯诺登,过去的安全就是攻和防之间的关系,即我们用一种什么样的体系.架构和模式去构建一个密不可破的安全系统.” 对IETF工作组忽视外部观察者看起来是一件甚么微不足道的事情的能力感到 ...

  2. 35.ES6语法介绍——2019年12月24日

    2019年12月24日16:22:24 2019年10月09日12:04:44 1. ES6介绍 1.1 新的 Javascript 语法标准 --2015年6月正式发布 --使用babel语法转换器 ...

  3. classloader加载class的流程及自定义ClassLoader

    java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ...

  4. Hive 笔试题

    Hive 笔试题 考试时间: 姓名:____________ 考试成绩:____________ 考试时长:180 分钟 注意事项: 1. 自主答题,不能参考任何除本试卷外的其它资料. 2. 总成绩共 ...

  5. Java动手动脑02

    一.平方数静方法: public class SquareInt { public static void main(String[] args) { int result; for (int x = ...

  6. JavaSE---泛型系统学习

    1.概述 1.1.泛型: 允许在   定义  类.接口.方法时  使用  类型形参,这个类型形参  将在声明变量.创建对象.调用方法时  动态地指定: 1.2.jdk5后,引入了  参数化类型(允许程 ...

  7. SpringCloud学习系列-Eureka服务注册与发现(3)

    修改microservicecloud-provider-dept-8001 1.修改pom 增加内容 <!-- 将微服务provider侧注册进eureka --> <depend ...

  8. 【SaltStack官方版】—— Events&Reactor系统—EVENT SYSTEM

    Events&Reactor系统 EVENT SYSTEM The Salt Event System is used to fire off events enabling third pa ...

  9. overload(重载) 和 override(重写)的区别

    overload(重载): 重载是基于一个类中,方法名相同,参数列表不同(如果参数列表相同时,参数的类型要不同),与返回值和访问修饰符都无关 如果在面试中就直接说:"同名不同参"  ...

  10. Spring AOP expose-proxy

    写在前面 expose-proxy.为是否暴露当前代理对象为ThreadLocal模式. SpringAOP对于最外层的函数只拦截public方法,不拦截protected和private方法(后续讲 ...