nyoj 单调递增子序列(二)

来源:互联网 发布:mac鼠标用法 编辑:程序博客网 时间:2024/04/28 01:29

http://blog.acmj1991.com/?p=767

题意:看题

思路:这题是用树状数组做的,跟poj 1631有一点区别就是数据范围更大了,我离散了一下貌似速度不是很快!!

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;#define maxN 100010int 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);}}


原创粉丝点击