UVALive 3938 Ray, Pass me the dishes! (动态最大连续和)
题意:求一个动态区间的最大连续和。
静态版本的O(n)算法显示不适用了,但是可以用线段树分治,因为一个连续和要在两边的区间,要么跨越两边,对于一个结点维护最大前缀和,后缀和,子区间连续和。
题目要求输出区间,所以还要保存连续和最大的区间,以及前缀和,后缀和的位置。为了维护最大前缀和以及后缀和还需要一个区间和。
写的时候稍微麻烦一点,更新写成一个函数会方便很多。还好一遍过了。。。
#include<bits/stdc++.h>
using namespace std; const int maxn = 5e5+;
typedef long long ll;
struct Seg
{
ll pre,suf,sub,sum;
int l,r,pr,sl;
}tr[maxn<<];
#define lid (id<<1)
#define rid (id<<1|1)
int n,m,a[maxn];
int ql,qr; void updata(Seg&u,Seg&v1,Seg&v2)
{
if(v1.pre >= v1.sum+v2.pre){//y
u.pr = v1.pr; u.pre = v1.pre;
}else {
u.pr = v2.pr; u.pre = v1.sum+v2.pre;
} if(v2.suf <= v2.sum+v1.suf){//x
u.sl = v1.sl; u.suf = v2.sum+v1.suf;
}else {
u.sl = v2.sl; u.suf = v2.suf;
} if(v1.sub >= v2.sub){
u.l = v1.l; u.r = v1.r; u.sub = v1.sub;
}else {
u.l = v2.l; u.r = v2.r; u.sub = v2.sub;
}
if(u.sub < v1.suf+v2.pre || (u.sub == v1.suf+v2.pre && (u.l>v1.sl ||(u.l == v1.sl && u.r > v2.pr) ) ) ){
u.sub = v1.suf+v2.pre; u.l = v1.sl; u.r = v2.pr;
} u.sum = v1.sum + v2.sum;
} void build(int l = ,int r = n,int id = )
{
if(l == r) {
Seg &u = tr[id];
u.pre = u.suf = u.sub = u.sum = a[l];
u.l = u.r = u.pr = u.sl = l;
return;
}
int mid = (l+r)>>, lc = lid, rc = rid;
build(l,mid,lc);
build(mid+,r,rc);
updata(tr[id],tr[lc],tr[rc]); } Seg query(int l = ,int r = n, int id = )
{
if(ql<=l&&r<=qr) { return tr[id]; }
int mid = (l+r)>>, lc = lid, rc = rid;
Seg ret;
if(ql<=mid && mid<qr){
Seg L = query(l,mid,lc), R = query(mid+,r,rc);
updata(ret,L,R);
return ret;
}
if(qr <= mid) {
return query(l,mid,lc);
}
return query(mid+,r,rc);
} int main()
{
//freopen("in.txt","r",stdin);
int kas = ;
while(~scanf("%d%d",&n,&m)){
for(int i = ; i <= n; i++) scanf("%d",a+i);
build();
printf("Case %d:\n",++kas);
while(m--){
int x,y; scanf("%d%d",&x,&y);
ql = x,qr = y;
Seg ans = query();
printf("%d %d\n",ans.l,ans.r);
}
}
return ;
}
UVALive 3938 Ray, Pass me the dishes! (动态最大连续和)的更多相关文章
- uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
题意:求q次询问的静态区间连续最大和起始位置和终止位置 输出字典序最小的解. 思路:刘汝佳白书 每个节点维护三个值 pre, sub, suf 最大的前缀和, 连续和, 后缀和 然后这个题还要记录解的 ...
- UVALive 3938 - "Ray, Pass me the dishes!" - [最大连续子列和+线段树]
题目链接:https://cn.vjudge.net/problem/UVALive-3938 参考刘汝佳书上说的: 题意: 给出一个长度为n的序列, 再给出m个询问, 每个询问是在序列 $[a,b] ...
- UvaLA 3938 "Ray, Pass me the dishes!"
"Ray, Pass me the dishes!" Time Limit: 3000MS Memory Limit: Unkn ...
- UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)
"Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小 ...
- UVA 1400 1400 - "Ray, Pass me the dishes!"(线段树)
UVA 1400 - "Ray, Pass me the dishes!" option=com_onlinejudge&Itemid=8&page=show_pr ...
- 【LA3938】"Ray, Pass me the dishes!"
原题链接 Description After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hun ...
- 线段树(区间合并) LA 3989 "Ray, Pass me the dishes!"
题目传送门 题意:动态最大连续子序列和,静态的题目 分析:nlogn的归并思想.线段树维护结点的三个信息,最大前缀和,最大后缀和,该区间的最大和的两个端点,然后答案是三个的better.书上用pair ...
- UVALive - 3938:"Ray, Pass me the dishes!"
优美的线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring& ...
- UVALive3938 "Ray, Pass me the dishes!" 线段树动态区间最大和
AC得相当辛苦的一道题.似乎不难,可是须要想细致, 開始的时候的错误思路----是受之前做过的区间最长连续子串影响http://blog.csdn.net/u011026968/article/det ...
随机推荐
- 第3章 编写ROS程序-2
1.发布者程序 在本节中,我们将看到如何发送随机生成的速度指令到一个turtlesim海龟,使它漫无目的地巡游.这个程序的源文件称为pubvel,这个程序展示了从代码中发布消息涉及的所有要素. 其代码 ...
- 12. nc/netcat 用法举例
nc命令用法举例 什么是nc nc是netcat的简写,有着网络界的瑞士军刀美誉.因为它短小精悍.功能实用,被设计为一个简单.可靠的网络工具 nc的作用 (1)实现任意TCP/UDP端口的侦听,nc可 ...
- Go中函数作为值、类型传递。
在Go中函数也是一种变量,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型 type typeName func(input1 inputType1 , input ...
- @functions @model @using
/////@functions自定义函数////// @helper辅助方法的确可以很方便的完成辅助方法开发,不过却失去了一些弹性,例如,无法在@helper中自定义属性,只能单纯的传入参数,然后格式 ...
- ApplicationContext的三个常用实现类:
ClassPathXmlApplicationContext 它可以加载类路径下的配置文件,要求配置文件必须在类路径下,不在的话加载不了 (java中获取类路径下资源的方式) FileSystemXm ...
- 自定义Swap
网上看到的一篇文章加深了对指针的了解,收藏一下 自定义的swap函数是一个老掉牙的问题,而这个问题对于理解指针和内存中的栈是很有帮助的 一般自定swap函数是这样的: 1.swap函数的功能是实现两个 ...
- window.onerror 捕捉所有的前端error
//[捕捉所有前端error] window.onerror = function (errormessage, url, line, column, error) { console.log(&qu ...
- SP2-0734: 未知的命令开头 “IMP ” - 忽略了剩余的行
描述 在cmd命令窗口中使用imp命令将dmp文件导入到oracle中时,出现了错误: SP2-0734: 未知的命令开头 “IMP ” - 忽略了剩余的行,如图 原因 imp命令是oracle提供的 ...
- AGC001 D - Arrays and Palindrome【构造】
把回文串的相等关系连一下,发现最后要求的是一笔画问题 注意到奇数长度的中间有一个单独没有连线的,所以a数组至多有两个奇数值 如果没有奇数,那么b在最前面放一个1,然后把a[1]~a[m-1]放上去,这 ...
- 深入V8引擎-Time模块介绍
积跬步,行千里,先从最简单的开始写. 这一篇介绍V8中的时间模块,与libuv粗糙的update_loop_time方法不同,V8有一套独立完整的类负责管理时间. 该类位于src/base/platf ...