Guest User

d.cpp

a guest
Nov 19th, 2025
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.01 KB | None | 0 0
  1. #include<cstdio>
  2. const int N=50010;
  3. int Case,n,i,x,a[N],b[N],ans[N],pre[N],nxt[N],f[N],g[N],used[N],bit[N];
  4. inline void up(int&a,int b){if(f[a]<f[b])a=b;}
  5. inline void build(){
  6.   int i,j,k;
  7.   for(i=nxt[0];i<=n+1;i=nxt[i]){
  8.     used[i]=0;
  9.     k=0;
  10.     for(j=a[i];j;j-=j&-j)up(k,bit[j]);
  11.     f[i]=f[k]+1;
  12.     g[i]=k;
  13.     for(j=a[i];j<=n+2;j+=j&-j)up(bit[j],i);
  14.   }
  15.   for(i=nxt[0];i<=n+1;i=nxt[i])for(j=a[i];j<=n+2;j+=j&-j)bit[j]=0;
  16.   for(i=n+1;i;i=g[i])used[i]=1;
  17. }
  18. int main(){
  19.   //scanf("%d",&Case);
  20.   Case = 1;
  21.   while(Case--){
  22.     scanf("%d",&n);
  23.     for(i=1;i<=n;i++)scanf("%d",&a[i]),a[i]++;
  24.     a[0]=1;
  25.     a[n+1]=n+2;
  26.     for(i=0;i<=n+1;i++)pre[i]=i-1,nxt[i]=i+1,bit[i]=used[i]=0;
  27.     bit[n+2]=0;
  28.     for(i=1;i<=n;i++)scanf("%d",&b[i]);
  29.     build();
  30.     for(i=n;i;i--){
  31.       ans[i]=f[n+1]-1;
  32.       x=b[i];
  33.       pre[nxt[x]]=pre[x];
  34.       nxt[pre[x]]=nxt[x];
  35.       if(used[x])build();
  36.     }
  37.     for(i=1;i<=n;i++)printf("%d%c",ans[i],i<n?' ':'\n');
  38.   }
  39. }
  40. /*
  41. 1
  42. 5
  43. 2 5 3 1 4
  44. 1 4 5 3 2
  45. */
Advertisement
Add Comment
Please, Sign In to add comment