红黑树 错的很离谱
  • 板块学术版
  • 楼主wzhm54nr
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/1/19 23:06
  • 上次更新2024/1/20 10:39:58
查看原帖
红黑树 错的很离谱
1071328
wzhm54nr楼主2024/1/19 23:06
#include<bits/stdc++.h>
using namespace std;
int fa[100005],son[100005][2],w[100005],sz[100005];
bool color[100005];
int root,tot;
void up(int p){sz[p]=sz[son[p][0]]+sz[son[p][1]];}
int id(int p){return w[p]>w[fa[p]];}
void rotate(int& y,int s){
    int x=son[y][!s],z=fa[y];
    son[y][!s]=son[x][s];
    fa[son[x][s]]=y;
    fa[x]=z;
    if(z)  son[z][id(y)]=x;
    else  root=x;
    son[x][s]=y;
    fa[y]=x;
    up(y);up(x);
}
void insertfixup(int i){
    int f;
    while((f=fa[i])&&(!color[f])){
        int g=fa[f],u=son[g][!id(f)];
        if(u&&!color[u]){
            color[u]=color[f]=1;
            color[g]=0;
            i=g;
            continue;
        }
        if(id(i)^id(f)){
            rotate(f,!id(i));
            swap(i,f);
        }
        color[f]=1;
        color[g]=0;
        rotate(g,!id(f));
    }
    color[root]=1;
}
void insert(int x){
    if(!root){
        w[root=++tot]=x;
        sz[root]=1;
        color[root]=1;
        return;
    }
    int now=root;
    for(;son[now][x>w[now]];now=son[now][x>w[now]])
        ++sz[now];
    ++sz[now];
    w[++tot]=x;
    fa[tot]=now;
    sz[tot]=1;
    son[now][x>w[now]]=tot;
    insertfixup(tot);
}
signed main(){
    freopen("1.txt","w",stdout);
    srand(time(0));
    for(int i=1;i<=10;i++){
        int x=rand();
        insert(x);
    }
    cout<<"root:"<<root<<'\n';
    for(int i=1;i<=10;i++){
        printf("%d:\nw:%d\nsub_size:%d\nfa:%d\nleft son&right son:%d %d\ncolor:",
        i,w[i],sz[i],fa[i],son[i][0],son[i][1]);
        cout<<color[i]<<"\n\n";
    }
}
2024/1/19 23:06
加载中...