input

n m  1<=n,m<=500000

a1 a2 ... an   |ai|<=1e9

m行查询

每行一对a b

output

对于每对a b输出区间[a,b]中最小连续和x y,如果有多组满足,输出x最小,如果还有多组满足,输出y最小

 #include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#define MAX 500000 using namespace std; struct pos
{
int s,e;
bool operator<(const pos&a)const
{
if(s!=a.s) return s<a.s;
return e<a.e;
}
};
struct node
{
long long sum,suf,pre;
int pree,sufs;
};
long long sum[MAX*],pre[MAX*],sub[MAX*],suf[MAX*],maxsum;
int n,m,pree[MAX*],sufs[MAX*],a,b,cas=;
pos subp[MAX*],minp;
void build(int l,int r,int k)
{
if(l==r)
{
scanf("%lld",&sum[k]);
pre[k]=suf[k]=sum[k];
pree[k]=sufs[k]=subp[k].s=subp[k].e=l;
sub[k]=sum[k];
return;
}
int m=l+((r-l)>>),lc=k<<,rc=(k<<)+;
build(l,m,lc);
build(m+,r,rc);
sum[k]=sum[lc]+sum[rc]; //sum
pre[k]=sum[lc]+pre[rc]; //pre
pree[k]=pree[rc];
if(pre[k]<=pre[lc])
{
pre[k]=pre[lc];
pree[k]=pree[lc];
}
suf[k]=suf[lc]+sum[rc]; //suf
sufs[k]=sufs[lc];
if(suf[k]<suf[rc])
{
sufs[k]=sufs[rc];
suf[k]=suf[rc];
}
sub[k]=pre[rc]+suf[lc]; //sub
subp[k].s=sufs[lc],subp[k].e=pree[rc];
if(sub[k]<sub[rc])
{
sub[k]=sub[rc];
subp[k]=subp[rc];
}
else if(sub[k]==sub[rc]) subp[k]=min(subp[k],subp[rc]);
if(sub[k]<sub[lc])
{
sub[k]=sub[lc];
subp[k]=subp[lc];
}
else if(sub[k]==sub[lc]) subp[k]=min(subp[k],subp[lc]);
}
node query(int l,int r,int k)
{
if(a<=l&&b>=r)
{
if(sub[k]>maxsum)
{
maxsum=sub[k];
minp=subp[k];
}
else if(sub[k]==maxsum) minp=min(minp,subp[k]);
node u;
u.pre=pre[k];u.pree=pree[k];u.sum=sum[k];u.suf=suf[k];u.sufs=sufs[k];
return u;
}
int m=l+((r-l)>>),lc=k<<,rc=(k<<)+;
node lcc,rcc;
if(a<=m) lcc=query(l,m,lc);
if(b>m) rcc=query(m+,r,rc);
if(a<=m&&b>m)
{
node u;
u.sum=lcc.sum+rcc.sum; //sum
u.pre=lcc.sum+rcc.pre; //pre
u.pree=rcc.pree;
if(u.pre<=lcc.pre)
{
u.pre=lcc.pre;
u.pree=lcc.pree;
}
u.suf=lcc.suf+rcc.sum; //suf
u.sufs=lcc.sufs;
if(u.suf<rcc.suf)
{
u.sufs=rcc.sufs;
u.suf=rcc.suf;
}
long long subk=rcc.pre+lcc.suf; //sub
pos subpk;
subpk.s=lcc.sufs,subpk.e=rcc.pree;
if(subk>maxsum)
{
maxsum=subk;
minp=subpk;
}
else if(subk==maxsum) minp=min(minp,subpk);
return u;
}
else if(a<=m) return lcc;
else return rcc;
}
int main()
{
freopen("/home/user/桌面/in","r",stdin);
while(scanf("%d%d",&n,&m)==)
{
build(,n,);
printf("Case %d:\n",cas++);
while(m--)
{
scanf("%d%d",&a,&b);
minp.s=minp.e=n;
maxsum=-0x7fffffff-;
query(,n,);
printf("%d %d\n",minp.s,minp.e);
}
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return ;
}

UVA 1400 线段树的更多相关文章

  1. UVa 1400 (线段树) "Ray, Pass me the dishes!"

    求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和. 线段树维护三个信息:区 ...

  2. uva 11525(线段树)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  4. UVa 11992 (线段树 区间修改) Fast Matrix Operations

    比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...

  5. UVA 11992 线段树

    input r c m      r<=20,1<=m<=20000 m行操作 1 x1 y1 x2 y2 v       add v 2 x1 y1 x2 y2 v       s ...

  6. uva 1513(线段树)

    题目链接:1513 - Movie collection 题意:有一堆电影,按1-n顺序排,有m次操作,每次询问第ai个电影之前有多少个电影,然后将其抽出放在堆顶. 分析:线段树应用. 因为每次查询后 ...

  7. uva 12086 线段树or树状数组练习

    题目链接   https://vjudge.net/problem/34215/origin 这个题就是线段树裸题,有两种操作,实现单点更新和区间和的查找即可,这里第一次学习使用树状数组完成. 二者相 ...

  8. UVa 12299 线段树 单点更新 RMQ with Shifts

    因为shift操作中的数不多,所以直接用单点更新模拟一下就好了. 太久不写线段树,手好生啊,不是这错一下就是那错一下. PS:输入写的我有点蛋疼,不知道谁有没有更好的写法. #include < ...

  9. UVA 12299 线段树 ( 单点跟新 , 区间查询)

    题目链接:题意:在传统的RMQ的基础上加上一个操作:shift(i1,i2,i3...ik),表示将这些元素,依次向左移动一位(训练指南247页) #include <iostream> ...

随机推荐

  1. WEB前端组件思想【分页】

    DEMO1: 很早就想写一些功能性的组件,无奈技术有限一点一点的边工作,边学. 近日工作中用到分页功能,当然由于加快业务进度,第一选择肯定是选择插件,但是实用性来说,还是有那么一点不适合.毕竟插件是通 ...

  2. 5、判断、循环、数组综合练习案例(迷你DVD)

    迷你dvd代码如下: package com.manager; import java.util.Scanner; public class DVDManage { public static voi ...

  3. jquey(判断文本框输入的网址链接是否符合规则)

    今天遇到一个问题,我要在文本框中输入一个网址链接,使其跳转.但是如何验证,我首先想到了正则表达式.对的,就是你想的那样,我对正则一知半解,但在我哥哥帮助下,最终是 实现 了效果.在此,来一发,分享一下 ...

  4. PHP7新功能及语法变化总结

    1.标量类型声明有两种模式: 强制 (默认) 和 严格模式. 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔 ...

  5. CALayer的隐式动画和显式动画

    隐式事务 任何对于CALayer属性的修改,都是隐式事务,都会有动画效果.这样的事务会在run-loop中被提交. - (void)viewDidLoad { //初始化一个layer,添加到主视图 ...

  6. bkViewer V4.9k(数码照片浏览工具)中文免费版

    软件名称: bkViewer 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 990KB 图片预览: 软件简介: 专为 ...

  7. 全排列dfs算法

    如下 #include <iostream> using namespace std; #define MAX 10 #define _CRT_SECURE_NO_WARNINGS int ...

  8. 通过httplib2 探索的学习的最佳方式

    在工作中需要对一个视频点播两百次,使其成为热门视频,才能对其p2p情况进行测试.虽然可以手动点播两百次,但是利用python发送200次post请求,能减少很多的工作量.该发送请求的方法用到了http ...

  9. #ifdef,#else,#endif,#if 拾忆

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短.   ...

  10. Ubuntu上用mod_wsgi部署Django出现的一些问题

    1 编码问题 直接运行Django没问题,但通过Apache+mod_wsgi上传中文字符的文件时出错: UnicodeEncodeError: 'ascii' codec can't encode ...