http://blog.acmj1991.com/?p=767
題意:看題
思路:這題是用樹狀數組做的,跟poj 1631有一點區別就是數據範圍更大了,我離散了一下貌似速度不是很快!!
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxN 100010
int key[maxN],pre[maxN],fa[maxN];
int low(int x){return x&(-x);}
int max(int x,int y){return x>y?x:y;}
int low_bun(int l,int r,int x)
{
if(l==r)return l;
int mid=(l+r)/2;
if(x<=fa[mid])return low_bun(l,mid,x);
else if(x>fa[mid])return low_bun(mid+1,r,x);
}
int get_max(int x)
{
int maxx=0;
while(x)
{
maxx=max(maxx,key[x]);
x-=low(x);
}
return maxx;
}
void update(int x)
{
int m=key[x];
do{
x+=low(x);
if(key[x]<m)key[x]=m;
else break;
}while(x<=maxN);
}
int main()
{
int t,n;
while(~scanf("%d",&n))
{
int maxx=0;
memset(key,0,sizeof(key));
for(int i=1;i<=n;i++){
scanf("%d",&pre[i]);
fa[i]=pre[i];
}
sort(fa,fa+n);
for(int i=1;i<=n;i++){
int m=low_bun(1,n,pre[i]);
key[m]=get_max(m-1)+1;
maxx=max(maxx,key[m]);
update(m);
}
printf("%d\n",maxx);
}
}