2019杭电暑假多校训练 第六场 Snowy Smile HDU - 6638
很多题解都是简单带过,所以打算自己写一篇,顺便也加深自己理解
前置知识:线段树、线段树维护最大字段和、二维坐标离散化
题解:
1.很容易想到我们需要枚举所有子矩阵来得到一个最大子矩阵,所以我们的任务是 “枚举所有子矩阵”,
二维前缀和暴力枚举达到O(n^4), DP结合前缀和枚举也需要O(n^3),然而我们的时间需要更少.
2.可以看到坐标范围为 -10^9~10^,但是点 n<=2000个,所以我们需要先将点 离散化。
3.将点 按y轴高度排序,枚举矩阵的上下界,这将达到O(n^2)了。
4.最重点的一步,将矩阵内的点 加入线段树维护。下面解释下这一步。
首先假设我们枚举的这一个矩阵的 上界为 up ,下界为 down ,目前的矩阵的宽度就已经知道是 up-down。
所以现在我们剩下的任务就是“枚举矩阵宽度” 来达到 “枚举宽度为up-down的所有子矩阵,找出宽度为up-down的最大子矩阵”。
我们宽度已知,所有要枚举也就是长度,这样我们可以把 “矩阵压缩称为一条线”。
这时候线段树的功能就能解决这个问题了。
用线段树来维护最大字段和,其实维护的是 “宽度为up-down”的最大矩阵和。
这样我们的时间复杂度就可以达到O(n^2 logn)了。
记得每次改变下界的时候要初始化线段树,关于这个初始化代码中还有一个小技巧,差不多减少了1.5s左右的时间。
#include <bits/stdc++.h> using namespace std;
typedef double dou;
typedef long long ll;
typedef pair<int, int> pii;
typedef map<int, int> mii; #define pai acos(-1.0)
#define M 4005
#define inf 0x3f3f3f3f
#define mod 1000000007
#define IN inline
#define left k<<1
#define right k<<1|1
#define lson L, mid, left
#define rson mid + 1, R, right
#define W(a) while(a)
#define lowbit(a) a&(-a)
#define ms(a,b) memset(a,b,sizeof(a))
#define Abs(a) (a ^ (a >> 31)) - (a >> 31)
#define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) int T, n;
ll vx[M], vy[M];
ll xlen, ylen, pos, ans;
struct Data {
int x, y, val;
bool operator <(Data& t) {
return y < t.y;
}
}node[M];
struct Data_t {
ll sum;
ll Lmax, Rmax, Max;
}tree[M << ]; IN void Updata(int L, int R, int k, int id,int add) {
if (L == R) {
tree[k].sum += (ll)add;
tree[k].Lmax = tree[k].Rmax = tree[k].Max = tree[k].sum;
return;
}
int mid = L + R >> ;
if (id <= mid)Updata(lson, id, add);
else Updata(rson, id, add); //维护最大字段和
tree[k].sum = tree[left].sum + tree[right].sum;
tree[k].Lmax = max(tree[left].Lmax, tree[left].sum + tree[right].Lmax);
tree[k].Rmax = max(tree[right].Rmax, tree[right].sum + tree[left].Rmax);
tree[k].Max = max(max(tree[left].Max, tree[right].Max), tree[left].Rmax + tree[right].Lmax);
} int main() {
false_stdio;
cin >> T;
W(T--) {
cin >> n;
for (int i = ; i <= n; i++) {
cin >> node[i].x >> node[i].y >> node[i].val;
vx[i] = node[i].x, vy[i] = node[i].y;
} //二维坐标离散化
sort(vx + , vx + n + );
sort(vy + , vy + n + );
xlen = unique(vx + , vx + n + ) - vx - ;
ylen = unique(vy + , vy + n + ) - vy - ;
for (int i = ; i <= n; i++) {
node[i].x = lower_bound(vx + , vx + xlen + , node[i].x) - vx;
node[i].y = lower_bound(vy + , vy + ylen + , node[i].y) - vy;
}
sort(node + , node + n + ); ans = ; //首先枚举下界
for (int dw = ; dw <= ylen; dw++) {
pos = ;
memset(tree, , (xlen * + ) * sizeof(Data_t));//初始化线段树,离散化完有多少个点就初始化多大 W(node[pos].y < dw && pos <= n)pos++;//直接跳过小于下界的点 for (int up = dw; up <= ylen; up++) {//枚举上界
W(pos <= n && node[pos].y <= up) {//将上界与下届之间的点加入线段树中
Updata(, xlen, , node[pos].x, node[pos].val);
pos++;
}
ans = max(ans, tree[].Max);
}
}
cout << ans << endl;
}
return ;
}
2019杭电暑假多校训练 第六场 Snowy Smile HDU - 6638的更多相关文章
- 2019牛客网暑假多校训练第四场 K —number
链接:https://ac.nowcoder.com/acm/contest/884/K来源:牛客网 题目描述 300iq loves numbers who are multiple of 300. ...
- HDU 4639 hehe 杭电2013多校联赛第四场1008题
解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态.先打一个 ...
- 2019牛客暑假多校赛(第二场) F和H(单调栈)
F-Partition problem https://ac.nowcoder.com/acm/contest/882/F 题意:输入一个数n,代表总共有2n个人,然后每个人对所有人有个贡献值,然后问 ...
- 2019牛客暑期多校训练营(第六场)C - Palindrome Mouse (回文自动机)
https://ac.nowcoder.com/acm/contest/886/C 题意: 给出一个串A , 集合S里面为A串的回文字串 , 现在在集合S里面找出多少对(a,b),b为a的字串 分析: ...
- 2019牛客暑期多校训练营(第六场)J Upgrading Technology
传送门 题意: 就是给你n个技能,每个技能最高升到m级,每升一级就是耗费Cij钱,这个Cij可能是负的,如果所有技能都升到或者说超过j等级,就会获得Dj钱,这个Dj也有可能是负值,让你求你最多得到多少 ...
- 山东省ACM多校联盟省赛个人训练第六场 poj 3335 D Rotating Scoreboard
山东省ACM多校联盟省赛个人训练第六场 D Rotating Scoreboard https://vjudge.net/problem/POJ-3335 时间限制:C/C++ 1秒,其他语言2秒 空 ...
- HDU6578 2019HDU多校训练赛第一场 1001 (dp)
HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...
- HDU6579 2019HDU多校训练赛第一场1002 (线性基)
HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...
- HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)
HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...
随机推荐
- DNS原理和智能DNS及CDN
CDN是什么 CDN(Content Delivery Network)是内容分发网络. 作用: 使用户可以就近取的所需要的内容,加速用户访问网站资源的速度.物理距离更近,响应速度更快.拦截部分网络请 ...
- Mysql自动备份与还原 转
Mysql自动备份与还原 一.自动备份:将以下代码保存为*.bat批处理脚本,然后再添加Windows定时作业,如每天凌晨2点执行:set s=%date:~0,4%%date:~5,2%%date: ...
- kafka创建topic,生产和消费指定topic消息
启动zookeeper和Kafka之后,进入kafka目录(安装/启动kafka参考前面一章:https://www.cnblogs.com/cici20166/p/9425613.html) 1.创 ...
- javaBean命名属性时的小注意点
javabean属性命名的时,第一个和第二个字母最好不要是大写字母,不然使用eclipse自动生成getter和setter方法时,会出现奇怪的问题,导致struts2封装属性的封装不上. priva ...
- win10 metasploit-framework 安装
1.metasploit.com官网下载.msi文件(可能下载速度会很慢) 2.安装时务必关闭Windows Defender及其他杀毒软件,并在安装完成后设置metasploit文件夹为白名单 wi ...
- 基于Ambari Server部署HDP集群实战案例
基于Ambari Server部署HDP集群实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署Ambari Server端 博主推荐阅读: https://www.c ...
- 洛谷 P2697 宝石串
题目传送门 解题思路: 将红色的设置为-1,绿色的为1,统计前缀和sum,如果sum[i] == sum[j],则说明i~j是一个稳定的区间 因为答案要求最大,所以我们要记录每个sum值的最左端点(也 ...
- SpringBoot基于easyexcel导出和写入Excel
easyexcel是阿里巴巴旗下开源项目,主要用于Excel文件的导入和导出处理,今天我们利用SpringBoot和easyexcel实战演示如何导出和写入Excel文件. 一.加入我们需要的ea ...
- 1834 [ZJOI2010]network 网络扩容
题解:先在原网络上跑最大流,然后加上带费用的边跑费用流 高一的时候做这道题怎么想不到? 注意:maxn代表的不一定是同一个变量的范围 #include<iostream> #include ...
- IBGP(内部BGP)的对等体组(命令解析)
IBGP(内部BGP)对等体组配置解析: ①:创建对等体组. ②:定义对等体组策略,指定邻居路由器及所在的AS. ③:定义,更新源. ④:(若边界)定义自己下一跳. ⑤:加入对等体组. IBGP(内部 ...