楊氏圖表,維護若干個單調不下降佇列。
每次新加入一個數時,先考慮第一個佇列:
如果可以放在最後,則放在最後。
否則找到最小的可以替換的替換掉,再將替換的數放入第二個佇列,以此類推。
最後$ans_i=\sum_{j=1}^i t_j$。
時間複雜度$O(n^2\log n)$。
#include<cstdio> #define N 5005 int n,i,x,t[N];unsigned char q[N][N]; void up(int p,int x){ if(x>=q[p][t[p]]){q[p][++t[p]]=x;return;} int l=1,r=t[p],mid,u; while(l<=r)if(q[p][mid=(l+r)>>1]>x)r=(u=mid)-1;else l=mid+1; up(p+1,q[p][u]),q[p][u]=x; } int main(){ scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&x),up(1,x); for(i=1;;i++){ printf("%d\n",t[i]+=t[i-1]); if(t[i]==n)return 0; } }