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名学生,方阵的行数为 ...
随机推荐
- Oracle 通过字段名查询其所在的表
select owner , table_name , column_name from dba_tab_columns where column_name='LOG_TYPE' ;
- Behave用户自定义数据类型
在step句子中, 所有的参数默认是string类型, 如果用户想使用复杂的或者其他数据类型, 就需要了解以下bahave中的数据类型. behave的数据类型转换器是在parse和cfparse中支 ...
- [转]Configure Network Drive Visible for SQL Server During Backup and Restore Using SSMS
本文转自:https://mytechmantra.com/LearnSQLServer/Configure-Network-Drive-Visible-for-SQL-Server-During-B ...
- ant编译apache-nutch-2.2.1结合mysql实现爬虫的安装配置全过程
之前的数据抓取都是用的八爪鱼软件,老大突发奇想要我自己搞个爬虫来抓取数据,网上找找貌似apache的nutch比较合适,于是就开始安装这啥nutch. 对于一个linux零基础的人来说,还要先学学li ...
- Xshell基础入门
启动 双击快捷方式,启动 新建回话 建立连接 在这里需要填写的是: 1. 连接名称 2. 服务器IP 3. 服务器端口(默认22) 填写完毕后,点击确定,保存配置,回到连接页面,可以看到多了一个测试服 ...
- VMWare开启DHCP和NAT服务(VMWare无法通过NAT上网以及和host主机通信的问题解决)
最近在学习Hadoop,开始做一个集群.由于各个节点的IP地址需要保持不变,我决定在VMWare采用NAT的模式联网. 但是在安装Ubuntu系统的时候,提示我DHCP服务未开启. Your netw ...
- Java集合--概述
目录 Java集合--概述 摘要 图示 正文 Java集合--概述 摘要 本文主要介绍集合的整体概念,并作为接下来Java集合实现类讲解的索引. 图示 这是在网上看到了这样一张图,感觉很清晰, ...
- BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)
题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...
- css points
<style type="text/css" rel="stylesheet">.a{ width:500px; height:400px;对放置图 ...
- DOM节点树和元素树--深度遍历
我们在阅读JS高级程序设计的时候,提到了节点树的概念.比如说: elem.parentNode---找elem的父节点: elem.childNodes---找elem的所有的直接子节点: elem. ...