| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
单调队列+线段树#include<stdio.h>
#include<iostream>
#define MAX_N 50009
using namespace std;
int q[MAX_N];
struct Tree
{
int left,right,maxSub;
}tree[4*MAX_N];
int a[MAX_N];
void build(int id,int l,int r)
{
tree[id].left=l,tree[id].right=r;
if(l==r)
{
tree[id].maxSub = l ;
return ;
}
int mid = (l+r)>>1;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].maxSub = a[tree[id*2].maxSub] < a[tree[id*2+1].maxSub] ? tree[id*2+1].maxSub : tree[id*2].maxSub ;
}
int query(int id,int l,int r)
{
if(tree[id].left==l&&tree[id].right==r)
return tree[id].maxSub;
int mid = (tree[id].left+tree[id].right)>>1;
if(r<=mid)
return query(id*2,l,r);
else if(l>mid)
return query(id*2+1,l,r);
int s1 = query(id*2,l,mid), s2 = query(id*2+1,mid+1,r);
return a[s1] < a[s2] ? s2 : s1 ;
}
int main()
{
int n ;
while(~scanf("%d",&n))
{
int res = 0 ,top = 0 ,temp;
for(int i=1;i<=n;++i)
scanf("%d",a+i);
build(1,1,n);
for(int i=1;i<=n;++i)
{
if(!top || a[q[top-1]] < a[i])
q[top++] = i ;
else
{
while(top && a[q[top-1]] > a[i])
{
--top;
temp = query(1,q[top],i-1);
res = max(res,temp-q[top]);
}
q[top++] = i ;
}
}
while(top)
{
--top;
temp = query(1,q[top],n);
res = max(res,temp-q[top]);
}
printf("%d\n",res ? res : -1);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator