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 ;
}

最新文章

  1. 【HDU】4418 Time travel
  2. HTTP Error 403没有了,但是中文全都是乱码。又是怎么回事?
  3. C++中的类型重定义
  4. UVA 11796 - Dog Distance
  5. python学习笔记30(全局变量的两种解决办法)
  6. layout布局实例化
  7. 关于preg_match()函数的一点小说明
  8. TypeScript体验
  9. 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法
  10. Eclipse 00: 常用快捷键
  11. ID基本操作(出血的定义)(置入图片)(添加页面)5.15
  12. Error【0007】:zabbix中因为curl版本过低而无法发送邮件
  13. 正则grep
  14. websphere设置企业应用使用的jvm最大最小内存
  15. 关于未来IT职业教育的思考
  16. PHP搭建(windows64+apache2.4.7+mysql-5.6+php5.5+phpMyAdmin)和Discuz安装
  17. 2017年浙江中医药大学程序设计竞赛 Solution
  18. Hibernate学习笔记四
  19. [原]MS SQL表字段自增相关的脚本
  20. 通过反编译让SpecFlow支持多层属性值的验证

热门文章

  1. 使用Angular构建单页面应用(SPA)
  2. 越狱开发-创建真正的后台程序(Daemon Process)
  3. MVC3+EF4.1学习系列(一)-------创建EF4.1 code first的第一个实例
  4. c# new关键字的三种用法
  5. C#正则分组实例
  6. 用mybatis生成插件自动生成配置文件
  7. iis本地无法通过ip地址访问网站
  8. iOS10访问用户权限的描述key值汇总
  9. grub4dos新手指南-1
  10. pig、hive以及hbase的作用