思路很清晰,实现很繁琐。分析过程可以参考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 动态最大连续区间 线段树的更多相关文章

  1. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  2. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  3. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 247  Solved: 113[Submit][Status][Discuss ...

  4. codeforces 893F - Physical Education Lessons 动态开点线段树合并

    https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...

  5. codeforces 915E - Physical Education Lessons 动态开点线段树

    题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...

  6. BZOJ4372烁烁的游戏——动态点分治+线段树(点分树套线段树)

    题目描述 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠.皮皮鼠会被 ...

  7. CF915E Physical Education Lessons 动态开点线段树

    题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...

  8. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  9. NOIP2017 列队——动态开点线段树

    Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

随机推荐

  1. Java 获取汉字串首字母并大写和获取汉字的全拼,英文字符不变

    在开发中我们难免会遇到需要提出汉字中的拼音的首字母.提出汉字的拼音,接着便介绍一个工具类 pinyin4j.jar,首先需要下载 jar 包. Pinyin4j是一个功能强悍的汉语拼音工具包,是sou ...

  2. [转]Lost parameter value during SQL trace in EF Core DbParameter 为 问号 ?

    本文转自:https://stackoverflow.com/questions/44202478/lost-parameter-value-during-sql-trace-in-ef-core 问 ...

  3. Ionic开发之如何修改Cordova插件

    由于大多数的Cordova plugin都是国外的,一些提示信息通常都是英文, 这就需要我们自己修改成中文信息. 除此之外,还有可能插件的样式,皮肤等和整体项目的风格不一致,这个时候也是要修改的. 可 ...

  4. Android 蓝牙操作详解

    1.启用蓝牙并使设备处于可发现状态    1.1 在使用BluetoothAdapter类的实例进操作之前,应启用isEnable()方法检查设备是否启用了蓝牙适配器.       // 使用意图提示 ...

  5. Jade——变体的HTML

    什么是jade? jade是一个模板引擎,是变体的HTML. 模板引擎就是一个库,用来解释素具渲染视图的框架,也可以叫做HTML的预处理语言. jade是Node.js的一个模板引擎,他的语法借鉴了H ...

  6. NodeJS之 Express框架 app.use(express.static)

    一 .设置静态文件目录 语法如下: app.use(express.static(_dirname + '/public')); //设置静态文件目录 注: 将静态文件目录设置为项目根目录 + ‘/p ...

  7. SSH框架中NoSuchMethodError: antlr.collections.AST.getLine()的解决方案

    问题: 当配置好SSH框架后,使用Hibernate的Query功能时发生如下异常: NoSuchMethodError: antlr.collections.AST.getLine() 原因: St ...

  8. 自己写一个java的mvc框架吧(一)

    自己写一个mvc框架吧(一) 目录 自己写一个mvc框架吧(一) 自己写一个mvc框架吧(二) 自己写一个mvc框架吧(三) 自己写一个mvc框架吧(四) 写之前的一些废话 废话 1 (总是要先随便说 ...

  9. ssm项目快速搭建(配置)

    核心jar包 <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncod ...

  10. Merge into用法

    简单的例子:好记性不如烂笔头 其基本语法规则是 merge into 目标表 a using 源表 b on(a.条件字段1=b.条件字段1 and a.条件字段2=b.条件字段2 ……) when ...