UVALive - 3938:"Ray, Pass me the dishes!"
优美的线段树
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 500000+10
#define ll long long
#define pii pair<int,int>
#define mp make_pair
using namespace std;
int a[MAXN];
int n,m;
struct Node{
int pre_dat;
ll pre_sum;
int suf_dat;
ll suf_sum;
pii dat;
ll sum;
ll d;
Node(int p1=,ll p2=,int p3=,ll p4=,pii p5=mp(,),ll p6=,ll p7=){
pre_dat=p1,pre_sum=p2,suf_dat=p3,suf_sum=p4,dat=p5,sum=p6,d=p7;
}
}data[MAXN<<];
Node Merge(Node t1,Node t2){
if(t1.dat==mp(,))return t2;
if(t2.dat==mp(,))return t1;
Node ret;
ret.d=t1.d+t2.d;
ret.pre_dat=t1.pre_dat,ret.pre_sum=t1.pre_sum;
if(ret.pre_sum<t1.d+t2.pre_sum){
ret.pre_dat=t2.pre_dat,ret.pre_sum=t1.d+t2.pre_sum;
}
ret.suf_dat=t2.suf_dat,ret.suf_sum=t2.suf_sum;
if(ret.suf_sum<=t2.d+t1.suf_sum){
ret.suf_dat=t1.suf_dat,ret.suf_sum=t2.d+t1.suf_sum;
}
ret.dat=t1.dat,ret.sum=t1.sum;
if(ret.sum<t2.sum){
ret.dat=t2.dat,ret.sum=t2.sum;
}
if(ret.sum<(t1.suf_sum+t2.pre_sum)||ret.sum==(t1.suf_sum+t2.pre_sum)&&ret.dat>mp(t1.suf_dat,t2.pre_dat)){
ret.dat=mp(t1.suf_dat,t2.pre_dat),
ret.sum=(t1.suf_sum+t2.pre_sum);
}
return ret;
}
void build(int k,int L,int R){
if(L+==R){
data[k].pre_dat=data[k].suf_dat=L;
data[k].dat=mp(L,L);
data[k].d=data[k].pre_sum=data[k].suf_sum=data[k].sum=a[L];
return;
}
build(k<<,L,(L+R)>>);
build(k<<|,(L+R)>>,R);
data[k]=Merge(data[k<<],data[k<<|]);
}
Node query(int a,int b,int k,int L,int R){
if(b<=L||R<=a){
return Node(,,,,mp(,),,);
}
else if(a<=L&&R<=b){
return data[k];
}
else{
int mid=((L+R)>>);
Node lc=query(a,b,k<<,L,mid);
Node rc=query(a,b,k<<|,mid,R);
return Merge(lc,rc);
}
}
void solve(){
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n+);
while(m--){
int x,y;
scanf("%d%d",&x,&y);
Node ans=query(x,y+,,,n+);
printf("%d %d\n",ans.dat.first,ans.dat.second);
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
int T=;
while(~scanf("%d%d",&n,&m)){
printf("Case %d:\n",++T);
solve();
}
return ;
}
UVALive - 3938:"Ray, Pass me the dishes!"的更多相关文章
- 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 ...
- 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] ...
- UVALive 3938 Ray, Pass me the dishes! (动态最大连续和)
题意:求一个动态区间的最大连续和. 静态版本的O(n)算法显示不适用了,但是可以用线段树分治,因为一个连续和要在两边的区间,要么跨越两边,对于一个结点维护最大前缀和,后缀和,子区间连续和. 题目要求输 ...
- 线段树(区间合并) LA 3989 "Ray, Pass me the dishes!"
题目传送门 题意:动态最大连续子序列和,静态的题目 分析:nlogn的归并思想.线段树维护结点的三个信息,最大前缀和,最大后缀和,该区间的最大和的两个端点,然后答案是三个的better.书上用pair ...
- UVa 1400 (线段树) "Ray, Pass me the dishes!"
求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和. 线段树维护三个信息:区 ...
随机推荐
- TensorFlow实现Softmax Regression识别手写数字中"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”问题
出现问题: 在使用TensorFlow实现MNIST手写数字识别时,出现"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应 ...
- 201621123050 《Java程序设计》第7周学习总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 1.事件:用户的操作,例如点击或输入之类的操作 2. ...
- 弹幕视频播放app案例分析
产品 哔哩哔哩动画 相对于其他视频播放软件来说,哔哩哔哩动画没有广告影响观看体验,而且内容更偏重于二次元,因此我更倾向于使用它. 第一部分 调研, 评测 #第一次上手体验 用起来还是比较方便,可以快速 ...
- 用python实现简单购物车功能
all_asset = 0 i1 = input("请输入总资产:") all_asset = int(i1) goods = [ {'name':'电脑','price':199 ...
- python 操作SQLAlchemy
SQLAlchemy python链接 pymysql mysql+pymysql://<username>:<password>@<host>/<dbnam ...
- 微信公众号Markdown编辑器, 适合代码排版
随着大家都转战微信公众平台,如何快速的编写文章就摆在了首要位置.不可否认,使用微信自带的编辑器可以做出好看的排版,甚至用第三方编辑器有更多的模板.但是,这些全部都需要手动的调整.本来公众平台就算是自媒 ...
- JAVA_SE基础——46.引用数据类型变量.值交换[独家深入解析]
需求:定义一个函数交换数组中两个元素的位置. code 1: import java.util.*; class Demo3 { public static void main(String[] ar ...
- 数据结构-线性表的链式存储相关算法(C语言实现)
链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...
- ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查
身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了.我们来看看在Core里面如何配置: 首先需要NuGet安装一个包:Microsoft.AspNetCore.Authent ...
- vue组件详解(五)——组件高级用法
一.递归组件 组件在它的模板内可以递归地调用自己, 只要给组件设置name 的选项就可以了. 示例如下: <div id="app19"> <my-compone ...