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 ...
随机推荐
- HDU - 4821 String(窗口移动+map去重+hash优化)
String Given a string S and two integers L and M, we consider a substring of S as “recoverable” if a ...
- Razor的主版页面框架
类似于2.0版本中的MasterPage主版页面框架,不过mvc3.0推出的RazorView内建的主版页面语法与原本的webFormview的MasterPage相差甚远 1,Razor的页面执 ...
- mock测试方法及实践改进
此文已由作者翟曜授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. mock测试常见的定义为:在测试过程中,对于某些不易构造或不易获取的对象,通过创建虚拟对象的方式来模拟测试的测 ...
- 洛谷P2583 地铁间谍
P2583 地铁间谍 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发 ...
- django视图 CBV 和 FBV
目录 视图 CBV 和 FBV 什么是视图? FBV function based view 基于函数的视图 CBV class based view 基于类的视图 小技巧 CBV 如何获取页面请求类 ...
- 修正linux系统时间
date 安装ntpdate工具# yum -y install ntp ntpdate 设置系统时间与网络时间同步# ntpdate cn.pool.ntp.org 将系统时间写入硬件时间# hwc ...
- ESQL 查询数据报 参数类型“Edm.Decimal”和“Edm.Double”不兼容
ESQL 查询数据报 参数类型“Edm.Decimal”和“Edm.Double”不兼容 System.Data.Entity.Core.Objects.ObjectQuery<TEntity& ...
- 【SPOJ】Substrings
出现次数很好处理,就是 \(right/endpos\) 集合的大小 那么,直接构建 \(SAM\) 求出每个位置的\(right\)集合大小 直接更新每个节点的\(longest\)就行了 最后短的 ...
- Django - CRM项目(3)
一.CRM项目的业务逻辑与表结构梳理 1.分析业务逻辑 (1) 引流(sem) (2) 网络咨询师(客服):添加客户信息和查看客户,分配销售 (3) 销售:查看私户 添加跟进记录 失败:加入公户 成功 ...
- list remove元素
public class TestList { public static void main(String[] args) { List<Integer> list = new Link ...