[2019杭电多校第六场][hdu6638]Snowy Smile(维护区间最大子段和)
题目链接: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(维护区间最大子段和)的更多相关文章
- 2019杭电多校第六场hdu6638 Snowy Smile(线段树+枚举)
Snowy Smile 题目传送门 解题思路 先把y离散化,然后把点按照x的大小进行排序,我们枚举每一种x作为上边界,然后再枚举其对应的每一种下边界.按照这种顺序插入点,这是一个压维的操作,即在线段树 ...
- [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 ...
- [2019杭电多校第六场][hdu6635]Nonsense Time
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6635 题意是说一开始所有数都冻结,第i秒会解冻第ki个数,求每秒状态下的最长上上升子序列长度. 这种题 ...
- 2018杭电多校第六场1009(DFS,思维)
#include<bits/stdc++.h>using namespace std;int a[100010];char s[20];int zhiren[100010];vector& ...
- 2017杭电多校第六场1008 Kirinriki
传送门 Kirinriki Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- 2017杭电多校第六场1011Classes
传送门 Classes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- 2017杭电多校第六场03Inversion
传送门 Inversion Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- 2019杭电多校第七场 HDU - 6656 Kejin Player——概率&&期望
题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...
- 2019 杭电多校第八场 HDU - 6665 Calabash and Landlord 两矩形分平面
题意 给出两个矩形,问这两个矩形把平面分成了几部分. 分析 不需要什么高级技能,只需 “简单” 的分类讨论. (实在太难写了,对拍找出错误都不想改 推荐博客,其中有个很好的思路,即只讨论答案为2,3, ...
随机推荐
- JVM GC Roots
如何确定一个堆中的对象是否死去? 两个思路: 1.引用计数法 给每个对象添加一个引用,用来统计指向该对象的引用计数.有引用时就加1,引用失效时就减1.任何时候引用计数为0,该对象就死亡了.可以被当做垃 ...
- web页面调用app的方法
use_app_goto_page: (skip_type, skip_target) => { // Android App if (/android/i.test(navigator.use ...
- 关于下拉框的onchange事件和onclick选择value值。
下拉框的onchange事件和onclick,一般最好都选择onchange事件,onclick可能会不兼容有些浏览器. 下面是代码: <!DOCTYPE html><html la ...
- div中放入一个img元素导致div高度会多出几个像素
在写代码的时候经常遇到这样一个问题,如果div里嵌套一个img元素且div的高度是由img的高度来撑开,那么div的高度总会比img的高度多3px.好了,废话不多说,直接给大家上代码. html代码: ...
- 【leetcode】581. Shortest Unsorted Continuous Subarray
题目如下: 解题思路:本题我采用的是最简单最直接最粗暴的方法,把排序后的nums数组和原始数组比较即可得到答案. 代码如下: /** * @param {number[]} nums * @retur ...
- mysql OR运算符 语法
mysql OR运算符 语法 作用:在 WHERE 子语句中把两个或多个条件结合起来. 语法:SELECT * FROM 表名 WHERE 字段1 运算符 值 OR 字段2 运算符 值 说明:如果第一 ...
- POJ 3261 Milk Patterns ( 后缀数组 && 出现k次最长可重叠子串长度 )
题意 : 给出一个长度为 N 的序列,再给出一个 K 要求求出出现了至少 K 次的最长可重叠子串的长度 分析 : 后缀数组套路题,思路是二分长度再对于每一个长度进行判断,判断过程就是对于 Height ...
- Java——final
- WWDC2017-advanced_animations_with_uikit
最后修改时间: 2017-12-1 官方视频链接 这个Session主要讲一下的几个内容: Basic(基础的): 动画工作原理 以及 动画如何计时 Interactive and Interrupt ...
- NSDate 那点事
转载自:http://my.oschina.net/yongbin45/blog/150114 NSDate对象用来表示一个具体的时间点. NSDate是一个类簇,我们所使用的NSDate对象,都是N ...