Codeforces Round #406 (Div. 1) C. Till I Collapse(主席树)

来源:互联网 发布:js正则表达式数字范围 编辑:程序博客网 时间:2024/06/05 10:31

原题链接:http://codeforces.com/contest/786/problem/C

直接用主席树暴力,分析复杂度的时候你会发现,复杂的是收敛于O(knlogn)的,k是一个常数(貌似2或者3?没细算),所以是可以这样暴力过去的。

#include<bits/stdc++.h>using namespace std;const int MAXN=1e5+5;const int M=MAXN*100;int n,q,tot;int a[MAXN];int T[MAXN],lson[M],rson[M],c[M];int build(int l,int r){int root=tot++;c[root]=0;if(l!=r){int mid=(l+r)>>1;lson[root]=build(l,mid);rson[root]=build(mid+1,r);}return root;}int update(int root,int pos,int val){int newroot=tot++,tmp=newroot;c[newroot]=c[root]+val;int l=1,r=n;while(l<r){int mid=(l+r)>>1;if(pos<=mid){lson[newroot]=tot++;rson[newroot]=rson[root];newroot=lson[newroot];root=lson[root];r=mid;}else{rson[newroot]=tot++;lson[newroot]=lson[root];newroot=rson[newroot];root=rson[root];l=mid+1;}c[newroot]=c[root]+val;}return tmp;}int query(int root,int l,int r,int k){int ret=0;if(l==r){if(k==0&&c[root])return l-1;return l;}int mid=(l+r)>>1;if(c[lson[root]]>k){return query(lson[root],l,mid,k);}else{return query(rson[root],mid+1,r,k-c[lson[root]]);}}int la[MAXN];int main(){//freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&n);tot=0;for(int i=1;i<=n;i++)scanf("%d",&a[i]);T[n+1]=build(1,n);for(int i=n;i>=1;i--){if(la[a[i]]){T[i]=update(T[i+1],la[a[i]],-1);T[i]=update(T[i],i,1);}else{T[i]=update(T[i+1],i,1);}la[a[i]]=i;}for(int i=1;i<=n;i++){int now=0,ans=0;while(now<n){now=query(T[now+1],1,n,i);ans++;}printf("%d ",ans);}printf("\n");return 0;}


0 0
原创粉丝点击