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!"
求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和. 线段树维护三个信息:区 ...
随机推荐
- 凡事预则立(Beta)
听说--凡事预则立 吸取之前alpha冲刺的经验教训,也为了这次的beta冲刺可以更好更顺利地进行,更是为了迎接我们的新成员玮诗.我们开了一次组内会议,进行beta冲刺的规划. 上一张我们的合照: 具 ...
- C语言——第四次作业
题目 题目一:计算分段函数 1.实验代码 #include <stdio.h> int main() { double x,y; scanf("%lf",&x) ...
- 亚马逊AWS学习——VPC里面几个概念的关系
VPC中涉及几个概念: VPC 子网 路由表 Internet网关 安全组 今天来讲讲这几个概念之间的关系. 1. VPC 说的就是VPC,当然VPC范围是最大的,VPC即virtual privat ...
- Flask 学习 四 数据库
class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primary_key=True) name = db.Co ...
- Flask学习 二 模板
jinja2模版 from flask import Flask,render_template app = Flask (__name__) @app.route ('/<name>') ...
- Windows Powershell脚本执行
在cmd下执行powershell进入shell模式: 变量定义:$i = 10 $a = ifconfig | findstr "192" Windows下的命令都可以执行如: ...
- js的构造函数共用事例
在使用构造函数去实现一种功能时,我们有时候往往需要实现这个功能,会因此产生多个堆内对象.这样就会造成堆内存滥用.占用不该占用的空间.为此我们可以利用函数把共用的内容封装起来.放便我们的使用.很多东西其 ...
- JS中apply和call的应用和区别
因为object没有某个方法,但是别的对象有,可以借助apply或call像别的对象借方法来操作. 猫吃鱼,狗吃肉,奥特曼打小怪兽. 有天狗想吃鱼了 猫.吃鱼.call(狗,鱼) 狗就吃到鱼了 猫成精 ...
- python/Django(增、删、改、查)操作
python/Django(增.删.改.查)操作 我们要通过pycharm中的Django模块连接MySQL数据库进行对数据的操作. 一.创建Django项目(每创建一个项目都要进行以下设置) 1.如 ...
- 一大波 Android 刘海屏来袭,全网最全适配技巧!
一.序 Hi,大家好,我是承香墨影! Apple 一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议.不过不管你怎样,Android 也要跻入 &q ...