bzoj1246(树状数组)

来源:互联网 发布:东方财富网 知乎 编辑:程序博客网 时间:2024/06/11 04:30

树状数组的灵活运用,维护的是最大值,因为整个数组就是一个前缀最大值,所以可以用实现,求一个前缀最大值,和更新pos之后的最大值。

很好的运用,多回顾思考

 

#include<cstdio>#include<cmath>#include<cstdlib>#include<algorithm>#include<cstring>using namespace std;const int N=20005;int n;int pos[N][6];int t[N*5],b[N*5];void updata(int i,int x){while (i<=n*5){t[i]=max(t[i],x);i+= i&-i ;}}int query(int i){int ans=0;while (i){ans=max(ans,t[i]);i-=i&-i;}return ans;}int main(){scanf("%d",&n);for (int x,i=1;i<=n*5;i++){scanf("%d",&x);pos[x][++pos[x][0]]=i;}for (int i=1;i<=n*5;i++) scanf("%d",&b[i]);for (int i=1;i<=n*5;i++){for (int j=5;j;j--){int p=pos[b[i]][j],tmp;tmp=max(query(p),query(p-1)+1);updata(p,tmp);}}printf("%d",query(n*5));return 0;}


 

0 0
原创粉丝点击