比赛 |
20150421 |
评测结果 |
MMMMMMMM |
题目名称 |
山海经 |
最终得分 |
0 |
用户昵称 |
ggwdwsbs |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2015-04-21 11:58:07 |
显示代码纯文本
#include<stdio.h>
const int maxn=1e6;
const int INF=2147483600;
struct aa
{
long long w;
int num;
};
int n,m,l,r;
aa a[maxn];
aa d[maxn][40];
aa d1[maxn][40];
aa max(aa x,aa y)
{
if(x.w>y.w) return x;
else return y;
}
aa min(aa x,aa y)
{
if(x.w>y.w) return y;
else return x;
}
int built_max()
{
for(int i=0;i<n;i++)
d1[i][0]=a[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=0;i+(1<<j)-1<n;i++)
d1[i][j]=max(d1[i][j-1],d1[i+(1<<(j-1))][j-1]);
}
aa query_max(int l,int r)
{
int k=0;
while(1<<(k+1)<=r-l+1) k++;
return max(d1[l][k],d1[r-(1<<k)+1][k]);
}
int built_min()
{
for(int i=0;i<n;i++)
d[i][0]=a[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=0;i+(1<<j)-1<n;i++)
d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
aa query_min(int l,int r)
{
int k=0;
while(1<<(k+1)<=r-l+1) k++;
return min(d[l][k],d[r-(1<<k)+1][k]);
}
int main()
{
freopen("hill.in","r",stdin);
freopen("hill.out","w",stdout);
scanf("%d%d",&n,&m);
long long ans=0;
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
ans+=x;
a[i].w=ans;
a[i].num=i;
}
long long time=m*n*n;
if(time>(1e9)*5)
{
built_min();
built_max();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
aa x=query_min(l-1,r-1);
aa y=query_max(l-1,r-1);
if(l-2>=0)
x.w-=a[l-2].w;
if(l-2>=0)
y.w-=a[l-2].w;
if(y.num>x.num&&x.w<0) y.w-=x.w,x.num++;
if(y.num<x.num) x.num=l-1;
printf("%d %d %d\n",x.num+1,y.num+1,y.w);
}
return 0;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
l--,r--;
int x,y,maxx=-INF;
for(int j=l;j<=r;j++)
for(int k=l-1;k<j;k++)
{
int ret=a[j].w-a[k].w;
if(maxx<ret)
{
maxx=ret;
x=j;
y=k;
}
}
printf("%d %d %d\n",y+2,x+1,maxx);
}
}