LA 3938 动态最大连续区间 线段树
思路很清晰,实现很繁琐。分析过程可以参考LRJ,自己的总结晚些放。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxN=5e5+,maxNode=1e6+;
#define ll long long
#define Seg pair<int,int>
#define fi first
#define se second #define lson l,m,rt*2
#define rson m+1,r,rt*2+1 ll prefix_sum[maxN];
ll sum(int L, int R) {return prefix_sum[R] - prefix_sum[L - ];}
ll sum(Seg p) {return sum(p.fi, p.se);}
Seg better(Seg a, Seg b) {
if (sum(a) != sum(b)) return sum(a) > sum(b) ? a : b;
else return a < b ? a : b;
} int qL, qR; struct SegTree {
int max_prefix[maxNode];
int max_suffix[maxNode];
Seg max_sub[maxNode]; void build(int l, int r, int rt) {
if (l == r) {
max_prefix[rt] = max_suffix[rt] = l;
max_sub[rt] = make_pair(l, l);
return;
}
int m = l + (r - l) / ;
int lch = rt * , rch = rt * + ;
build(lson);
build(rson); // push_up
// 递推max_prefix
ll v1 = sum(l, max_prefix[lch]);
ll v2 = sum(l, max_prefix[rch]);
if (v1 == v2) max_prefix[rt] = min(max_prefix[lch], max_prefix[rch]);
else max_prefix[rt] = v1 > v2 ? max_prefix[lch] : max_prefix[rch]; // 递推max_suffix
v1 = sum(max_suffix[lch], r);
v2 = sum(max_suffix[rch], r);
if (v1 == v2) max_suffix[rt] = min(max_suffix[lch], max_suffix[rch]);
else max_suffix[rt] = v1 > v2 ? max_suffix[lch] : max_suffix[rch]; // 递推max_sub
max_sub[rt] = better(max_sub[lch], max_sub[rch]);
max_sub[rt] = better(max_sub[rt], make_pair(max_suffix[lch], max_prefix[rch]));
} Seg query_prefix(int l, int r, int rt) {
if (max_prefix[rt] <= qR) return make_pair(l, max_prefix[rt]);
int m = (l + r) / ;
int lch = rt * ;
if (qR <= m) return query_prefix(lson);
Seg i = query_prefix(rson);
i.fi = l;
return better(i, make_pair(l, max_prefix[lch]));
}
Seg query_suffix(int l, int r, int rt) {
if (max_suffix[rt] >= qL) return make_pair(max_suffix[rt], r);
int m = (l + r) / ;
int rch = * rt + ;
if (qL > m) return query_suffix(rson);
Seg i = query_suffix(lson);
i.se = r;
return better(i, make_pair(max_suffix[rch], r));
}
Seg query(int l, int r, int rt) {
if (qL <= l && r <= qR) return max_sub[rt];
int m = (l + r) / ;
if (qR <= m) return query(lson);
if (qL > m) return query(rson);
Seg i1 = query_prefix(rson);
Seg i2 = query_suffix(lson);
Seg i3 = better(query(lson), query(rson));
return better(make_pair(i2.fi, i1.se), i3);
}
}; SegTree tree; int main() {
// freopen("data.in", "r", stdin);
int kase = , n, a, Q;
while (~scanf("%d%d", &n, &Q)) {
prefix_sum[] = ;
for (int i = ; i < n; ++i) {
scanf("%d", &a);
prefix_sum[i + ] = prefix_sum[i] + a;
}
tree.build(, n, );
printf("Case %d:\n", ++kase);
while (Q--) {
int L, R;
scanf("%d%d", &L, &R);
qL = L, qR = R;
Seg ans = tree.query(, n, );
printf("%d %d\n", ans.fi, ans.se);
}
}
return ;
}
LA 3938 动态最大连续区间 线段树的更多相关文章
- [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)
题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...
- [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
- codeforces 893F - Physical Education Lessons 动态开点线段树合并
https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...
- codeforces 915E - Physical Education Lessons 动态开点线段树
题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...
- BZOJ4372烁烁的游戏——动态点分治+线段树(点分树套线段树)
题目描述 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠.皮皮鼠会被 ...
- CF915E Physical Education Lessons 动态开点线段树
题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...
- 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)
题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...
- NOIP2017 列队——动态开点线段树
Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 ...
随机推荐
- windows 系统安装 IIS 以及配置 web
Win7系统或win8自带了IIS和framework,不需要单独去下载,只需要开启后就可以运行asp.net程序 由于时间关系,先分享两个关于这个的链接: win7安装iis及web配置教程 htt ...
- 任务三十七:UI组件之浮出层
任务三十七:UI组件之浮出层 面向人群: 有一定JavaScript基础 难度: 低 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量 ...
- C# BBcode 转 Markdown
本文告诉大家一个简单的方法从 BBcode 转为 Markdown 本文的方法都是使用正则转换,现在支持的代码只有很少的常用标签,如果大家发现有转换失败的,请帮我修改代码,估计代码我不会进行修改. 最 ...
- package.json中devDependencies与dependencies的区别
前言:之前一直不懂既然都是项目的依赖,为什么要分成两个部分,devDependencies和dependencies,有什么区别? 安装方式 我们在通过npm安装插件或库时,有三种方式: npm in ...
- mysql_real_escape_string与mysqli_real_escape_string
参考 mysql_real_escape_string mysqli_real_escape_string mysql_real_escape_string是用来转义字符的,主要是转义POST或GE ...
- H5新增属性classList
H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...
- 网络基础 Windows下安装和配置net-snmp 代理
Windows 下安装和配置net-snmp 代理[摘录] by:授客 QQ:1033553122 A. 安装 1. 安装前准备 ActivePerl-5.10.0.1004-MSWin ...
- 前端 css+js实现返回顶部功能
描述: 本文主要是讲,通过css+js实现网页中的[返回顶部]功能. 实现代码: HTML: <div> <button onclick="returnTop()" ...
- maven 插件jetty/tomcat启动 web 应用
tomcat <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomca ...
- 你写的什么垃圾代码让Vsync命令不能及时处理呢?(1)
想想自己写的什么垃圾代码导致Vsync不能及时处理#(不高兴) 想不开? 实际开发中性能问题不好复现?这你就可能需要一些工具来帮你检测这种情况. 首先是Android系统自带的工具(4.1之后的版本) ...