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 ...
随机推荐
- 微信小程序开发之日期组件
一: wxml: <view class="navbarlift" style="background:#ffffff;padding:20rpx"> ...
- sql中的begin....end
Begin...End之间的是一个语句块,一般Begin...End用在 ( 相当于 {})whileif等语句中在T_SQL中,if/while后只能紧跟一条sql语句,如果有多条则应该用Beg ...
- ACM-ICPC2018北京网络赛 80 Days(双端队列+尺取)
题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...
- cassandra的命令
cassandra的命令: connect <hostname>/<port> (<username> '<password>')?; Conne ...
- Unity 5.6中的混合光照(下)
https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...
- MySQL最佳客户端工具 -- SQLyog 13.1.1.0 安装与注册
一.前言 SQLyog是一个易于使用的.快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库!SQLyog是业界著名的 Webyog 公司出品的一款简洁高效.功能强大的图 ...
- Robot Frame应用实例讲解
关键字与变量 内置库(build in)关键字 要使用的其它库关键字(学会看文档)
- B-Tree深入理解
定义: 根节点至少包括两个孩子 树中每个节点最多含有m个孩子(m>=2) 除根节点和叶子节点外,其他每个节点字少有(ceil(m/2):去上线),个孩子. 所有叶子节点都位于同一高度 假设每个非 ...
- 74cms漏洞分析
很早以前的一个洞,看到很有意思就拿来看看 这是雨曾经审过的一个洞,因为读取方式很特别复现了一下 upload\plus\weixin.php public function responseMsg() ...
- CodeForces - 508B-Anton and currency you all know
Berland, 2016. The exchange rate of currency you all know against the burle has increased so much th ...