思路很清晰,实现很繁琐。分析过程可以参考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. lua热更框架之XLua

    框架介绍 xLua是当下最流行的unity热更方案之一,作者是腾讯的车雄生前辈,自2016年初推出以来,已经在腾讯的多款游戏项目上应用,目前xLua已经开源到了GitHub.xLua最大的特色是不仅支 ...

  2. Java8常用新特性实践

    前言: 时下Oracle开速迭代的Java社区以即将推出Java10,但尴尬的是不少小中企业仍使用JDK7甚至JDK6开发. 从上面列出的JDK8特性中我们可以发现Java8的部分特性很明显的是从Sc ...

  3. webbrowser打开新窗口事件+=

    测试可用: private void SaveSnapshot_Click(object sender, EventArgs e) { this.webBrowser1.Navigate(txturl ...

  4. handlebars——另外一个模板引擎

    什么是handlebars? handlebars库是另外一个模板引擎,他继承mustache(胡子),感觉没有jade(珠宝)好听,他不允许在模板中写很多JavaScript的逻辑.这有助于保持模板 ...

  5. mysql 表支持事务的方法

    1.在mysql客户管,如:Navicate.SQLyog在导航面板中选择要转换为InnoDB存储引擎类型的数据库,例如选择db_yunping数据库.如下图所示: 2. 在查询窗口中输入 show ...

  6. 如何向Maven仓库(私服)中上传第三方jar包

    本文详细介绍如何向maven仓库中上传第三方jar包. 1.在本地maven安装路径中找到conf文件夹下面的setting.xml文件,里面有访问maven仓库的路径和账号.密码: 2.浏览器打开第 ...

  7. 使用css实现炫酷的横屏滚动效果

    炫酷的横屏滚动效果css实现 DEMO: https://codepen.io/kobako/pen/BxVLLm 我们对滚动条都不陌生.平时浏览的网页,进度条通常是垂直方向的,内容从上往下排列.但是 ...

  8. CSS关于文本渲染的属性text-rendering

    CSS关于文本渲染的属性text-rendering告诉渲染引擎工作时如何优化显示文本. 浏览器会在渲染速度.易读性(清晰度)和几何精度方面做一个权衡. 我们知道,SVG-可缩放矢量图形(Scalab ...

  9. COGS2608 [河南省队2016]无根树

    传送门 这题大概就是传说中的动态树形DP了吧,学习了一波…… 首先,对于没有修改的情况,不难想到树形DP,定义$f_i$表示强制必须选$i$且只能再选$i$的子树中的点的最优解,易得转移方程$f_i= ...

  10. Web缓存加速指南(转载)

    这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后面参考 ...