记录编号 45501 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010冲刺十二]奶牛排队 最终得分 100
用户昵称 Gravatar白乐水 是否通过 通过
代码语言 C++ 运行时间 0.305 s
提交时间 2012-10-24 10:16:02 内存使用 45.75 MiB
显示代码纯文本
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;

struct node
{
 int l,r,ma,mi;
} tree[2000040];

int ans,n,a[500010],lc[2000040],rc[2000040],tot,root;

int max(int x,int y){if (a[x]>a[y] || (a[x]==a[y] && x>y)) return x; return y;}
int min(int x,int y){if (a[x]<a[y] || (a[x]==a[y] && x>y)) return x; return y;}

void build(int &t,int l,int r)
{
 tot++; t=tot;
 tree[t].l=l; tree[t].r=r;;
 if (l==r) {tree[t].ma=l;tree[t].mi=l;return;}
 int mid=(l+r)/2;
 build(lc[t],l,mid);
 build(rc[t],mid+1,r);
 tree[t].ma=max(tree[lc[t]].ma,tree[rc[t]].ma);
 tree[t].mi=min(tree[lc[t]].mi,tree[rc[t]].mi);
}

int fida(int t,int l,int r)
{
 if (l>r) return n+1;
 if (tree[t].l==l && tree[t].r==r) return tree[t].ma;
 int mid=(tree[t].l+tree[t].r)/2;
 if (r<=mid) return fida(lc[t],l,r);
 else if (mid+1<=l) return fida(rc[t],l,r);
      else return max(fida(lc[t],l,mid),fida(rc[t],mid+1,r));
}

int fixi(int t,int l,int r)
{
 if (l>r) return 0;
 if (tree[t].l==l && tree[t].r==r) return tree[t].mi;
 int mid=(tree[t].l+tree[t].r)/2;
 if (r<=mid) return fixi(lc[t],l,r);
 else if (mid+1<=l) return fixi(rc[t],l,r);
      else return min(fixi(lc[t],l,mid),fixi(rc[t],mid+1,r));
}

void dfs(int l,int r)
{
 if (l>=r) return;
 if (r-l+1<=ans) return;
 if (r-l==1) {if (a[l]<a[r]) {ans=max(ans,2);}return;}
 int ml=fixi(root,l,r);
 int mr=fida(root,l,r);
 if (a[ml]==a[mr]) return;
 if (ml<mr)
  {
   if (a[fida(root,ml,mr-1)]<a[mr] && a[fixi(root,ml+1,mr)]>a[ml])
     if (mr-ml+1>ans) {ans=mr-ml+1;}
   dfs(l,ml-1);
   dfs(mr+1,r);
  }
 else
  {
   dfs(l,mr);
   dfs(mr+1,ml-1);
   dfs(ml,r);
  }
}

int main()
{
 freopen("tahort.in","r",stdin);
 freopen("tahort.out","w",stdout);

 scanf("%d\n",&n);
 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
 a[0]=0;
 a[n+1]=2147483647;
 root=0; tot=0;
 build(root,1,n);
 ans=0;
 dfs(1,n);
 printf("%d\n",ans);

 fclose(stdin);
 fclose(stdout);
 return 0;
}