记录编号 447172 评测结果 AAAAAAATTT
题目名称 [NOIP 2013]花匠 最终得分 70
用户昵称 Gravatar+1s 是否通过 未通过
代码语言 C++ 运行时间 3.023 s
提交时间 2017-09-09 15:41:40 内存使用 70.68 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,a[100010],ar[100010],tp[100010],k,re[100010][5];
struct tre{int l,r,ma;}stree[5000500],stree2[5000500];
int mxx(int a,int b){return a>b?a:b;}
void bui(int l,int r,int idx,struct tre *t)
{
	(t+idx)->l=l;
	(t+idx)->r=r;
	(t+idx)->ma=0;
	if(l==r)return;
	int m=(l+r)/2;
	bui(l,m,idx*2,t);
	bui(m+1,r,idx*2+1,t);
}
int qry(int l,int r,int idx,struct tre t[])
{
	if(l>r)return 0;
	if(t[idx].l==0&&t[idx].r==0)return 0;
	if(t[idx].l==l&&t[idx].r==r)return t[idx].ma;
	if(r<=t[idx*2].r)return qry(l,r,idx*2,t);
	else if(l>=t[idx*2+1].l)return qry(l,r,idx*2+1,t);
	else return mxx(qry(l,t[idx*2].r,idx*2,t),qry(t[idx*2+1].l,r,idx*2+1,t));
}
void upda(int nu,int val,int idx,struct tre *tr)
{
	if((tr+idx)->l==0&&(tr+idx)->r==0)return;
	if((tr+idx)->l<=nu&&nu<=(tr+idx)->r)(tr+idx)->ma=mxx((tr+idx)->ma,val);
	upda(nu,val,idx*2,tr);
	upda(nu,val,idx*2+1,tr);
}
int bs(int nu)
{
	int lo=1,hi=k;
	while(lo<hi)
	{
		int md=(lo+hi)>>1;
		if(tp[md]>=nu)hi=md;
		else lo=md+1;
	}
	return hi;
}
int ma()
{
	freopen("FlowerNOIP2013.in","r",stdin);
	freopen("FlowerNOIP2013.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		a[i]++;
		ar[i]=a[i];
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++)if(a[i]!=a[i-1])tp[++k]=a[i];
	for(int i=1;i<=n;i++)ar[i]=bs(ar[i]);
	bui(1,n,1,stree);
	bui(1,n,1,stree2);
	re[1][0]=re[1][1]=1;
	upda(ar[1],1,1,stree);
	upda(ar[1],1,1,stree2);
	for(int i=2;i<=n;i++)
	{
		int m1=0,m2=0;
		m1=qry(ar[i]+1,n,1,stree2),m2=qry(1,ar[i]-1,1,stree);
		re[i][0]=m1+1;
		re[i][1]=m2+1;
		upda(ar[i],m1+1,1,stree);
		upda(ar[i],m2+1,1,stree2);
	}
	int mx=0;
	for(int i=1;i<=n;i++)mx=mxx(mx,max(re[i][0],re[i][1]));
	printf("%d",mx);
	return 0;
}
int faq=ma();
int main()
{
	return 0;
}