24ptsTLE,treap树求调
  • 板块P1801 黑匣子
  • 楼主ParaIron
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/27 22:20
  • 上次更新2024/11/28 10:56:57
查看原帖
24ptsTLE,treap树求调
1086882
ParaIron楼主2024/11/27 22:20

玄关

#include <bits/stdc++.h>
using namespace std;
int cnt=0;
int inp[200005],fid[200005];
struct Node
{
    int ls,rs;
    int key,pri;
    int sized;
}t[10005];
void newNode(int x)
{
    cnt++;
    t[cnt].sized=1;
    t[cnt].ls=0; t[cnt].rs=0;
    t[cnt].key=x;
    t[cnt].pri=rand();
}
void updated(int u){t[u].sized=t[t[u].ls].sized+t[t[u].rs].sized+1;}
void rotated(int &o,int d)
{
    int k;
    if(d==1)
    {
        k=t[o].rs;
        t[o].rs=t[k].ls;
        t[k].ls=o;
    }
    else
    {
        k=t[o].ls;
        t[o].ls=t[k].rs;
        t[k].rs=o;
    }
    t[k].sized=t[o].sized;
    updated(o);
    o=k;
}
void inserted(int &u,int x)
{
    if(u==0) {newNode(x);u=cnt;return;}
    t[u].sized++;
    if(x>=t[u].key) inserted(t[u].rs,x);
    else inserted(t[u].ls,x);
    if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri) rotated(u,0);
    if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri) rotated(u,1);
    updated(u);
}
int kth(int u,int k)
{
    if(k==t[t[u].ls].sized+1) return t[u].key;
    if(k>t[t[u].ls].sized+1) return kth(t[u].rs,k-t[t[u].ls].sized-1);
    return kth(t[u].ls,k);
}
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    int root=0;
    for(int i=1;i<=m;i++) scanf("%d",&inp[i]);
    for(int i=1;i<=n;i++)
    {
        int x; scanf("%d",&x);
        fid[x]++;
    }
    int g=0;
    for(int i=1;i<=m;i++)
    {
        inserted(root,inp[i]);
        while(fid[i])
        {
            g++;
            printf("%d\n",kth(root,g));
            fid[i]--;
        }
    }
    return 0;
}

2024/11/27 22:20
加载中...