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 ...
随机推荐
- linux c实现的提取文件名的小程序
/*@author etangyushan *工作中很多时候会和文件名打交道,有时候只需要文件名称,就写了这么一个小程序 *这个函数实现了把一个文件的绝对路径和后缀去除,只留下文件名的功能 * */ ...
- UVaLive 3266 Tian Ji -- The Horse Racing (贪心)
题意:田忌赛马,每胜一局就得200,负一局少200,问最多得多少钱. 析:贪心,如果最快的马比齐王的还快,就干掉它,如果最慢的马比齐王的马快,就干掉它,否则用最慢的马去和齐王最快的马比. 代码如下: ...
- MongoDB官方C#驱动的AsQueryable踩到坑了
collection.AsQueryable().Where()有4个重载,分别是: public static IQueryable<TSource> Where<TSource& ...
- Linux绘图函数
gdk_draw_line () gdk_draw_rectangle () gdk_draw_arc () gdk_draw_polygon () gdk_draw_string () gdk_dr ...
- Hadoop 2.7.3 HA 搭建及遇到的一些问题
看了Hadoop的一个7天视频教程,里面给出了搭建的详细步骤,教程中是按2.4.1版本搭建的,我用的是2.7.3版本,好像没什么差别.下面是抄过来的,加了一点注释. hadoop2.0已经发布了稳定版 ...
- 洛谷P2759 奇怪的函数
P2759 奇怪的函数 题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^x 达到 n 位数字的最小正整数 x ...
- Docker 安装部署RabbitMQ
获查询镜像 docker search rabbitmq:management 可以看到如下结果: 获取镜像 docker pull rabbitmq:management 运行镜像 docker r ...
- Hibernate5 四种数据源配置
1.需要知道的: DBCP在hibernate3中以及不再被支持了,由于作者提出过bug,后续版本没有加入对其的支持. 推荐使用proxool,负面新闻最少的连接池 下面的图显示了,Hibernate ...
- STM32之CAN
概述:STM32有3个发送邮箱,发送调度器根据优先级决定先发送那个,相当于有3个发送帧FIFO;接收方面有14个过滤器,通过编程可以从CAN的接收引脚中选择需要的报文然后分别给2个接收帧FIFO(每个 ...
- (转) RHEL7 忘记密码修改root密码
博客链接:http://blog.csdn.net/derkampf/article/details/54346516 RHEL7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ct ...