机械未完成

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100010;
struct Node
{
    int s[2], p, v;
    int size,flag;

    void init(int _v, int _p)
    {
        v = _v, p = _p;
        size = 1;
    }
}tr[N];
int root, idx,m,n;

struct num{
    int val,id;
    inline operator < (const num& A)const{
    
    if(val==A.val) return id < A.id;
    return val < A.val;
    }
}a[N];

void pushup(int x) {
    tr[x].size = tr[tr[x].s[0]].size + tr[tr[x].s[1]].size + 1;
}

void pushdown(int x)
{
    if(tr[x].flag){
        swap(tr[x].s[0],tr[x].s[1]);
        tr[tr[x].s[0]].flag ^=1;
        tr[tr[x].s[1]].flag ^=1;
        tr[x].flag=0;
    }
}

void rotate(int x)  // 旋转
{
    int y = tr[x].p, z = tr[y].p;
    int k = tr[y].s[1] == x;
    tr[z].s[tr[z].s[1] == y] = x, tr[x].p = z;
    tr[y].s[k] = tr[x].s[k ^ 1], tr[tr[x].s[k ^ 1]].p = y;
    tr[x].s[k ^ 1] = y, tr[y].p = x;
    pushup(y), pushup(x);
}

void splay(int x, int k)  // splay操作
{
    while (tr[x].p != k)
    {
        int y = tr[x].p, z = tr[y].p;
        if (z != k)
            if ((tr[y].s[1] == x) ^ (tr[z].s[1] == y)) rotate(x);
            else rotate(y);
        rotate(x);
    }
    if (!k) root = x;
}

void insert(int v){
    int u=root,p=0;
    while(u)p=u,u=tr[u].s[v>tr[u].v];
    u=++idx;
    if (p) tr[p].s[v>tr[p].v]=u;
    tr[u].init(v,p);
    splay(u,0);
}

int get(int v){  //查找树的位置 
    int u,res;
    while(u){
        if(tr[u].v >= v) res = v;
        else u=tr[u].s[1];        
    }
    return res;
}



int get_k(int k) { //查找排名为k的树 
    int u = root;
    while (true) {
        pushdown(u);
        if (tr[tr[u].s[0]].size >= k) u = tr[u].s[0];
        else if (tr[tr[u].s[0]].size + 1 == k) return u;
        else k -= tr[tr[u].s[0]].size + 1, u = tr[u].s[1];
    }
    return -1;
}

int Next(int x,int f){ //查找x的前驱(0)或者后继(1)
    get_k(x);
    int u=root;
    if(tr[u].v>x&&f) return u;
    if(tr[u].v<x&&!f) return u;
    u=tr[u].s[f];
    while(tr[u].s[f^1]) u=tr[u].s[f^1];
    return u;
}

void Delete(int x){
    int last=Next(x,0),next=Next(x,1);
    splay(last,0);splay(next,last);
    int del=tr[next].s[0];//后继的左儿子
    if(tr[del].size>1)//如果超过一个
    {
        tr[del].size--;//直接减少一个
        splay(del,0);//旋转
    }
    else
        tr[next].s[0]=0;//这个节点直接丢掉(不存在了)
}


void output(int u){
    pushdown(u);
    if (tr[u].s[0]) output(tr[u].s[0]);
    if (tr[u].v>=1&&tr[u].v<=n) cout<<tr[u].v<<" ";
    if (tr[u].s[1]) output(tr[u].s[1]);
}

int main(){
    
    
    while((cin>>n)!=0){
        for(int i = 1;i <= n;i ++){
            cin>>a[i].val;
            insert(a[i].id);
            a[i].id=i;
        }
        sort(a+1,a+n+1);
        for(int i = 1;i <= n;i ++){
            splay(a[i].id,0);
            rotate(tr[0].s[0]);
            cout<<i+tr[0].size<<" ";
            Delete(a[i].val);
        }
        cout<<n<<endl;
    }
    
    return 0;
    
}

 

posted @ 2021-07-13 20:37  limited_Infinite  阅读(33)  评论(0编辑  收藏  举报
// //返回顶部 //返回顶部按钮