• LuoguP3377 左偏树 (左偏树)


    TLE but corrct in most cases.

    inline int Find(int x){
        //be careful with the way used for finding your grand papa
        for(; fa[x]; x = fa[x]);
        return x;
    }
    inline int Merge(int x,int y){
        if(!x) return y;
        if(!y) return x;
        if(val[x] > val[y] || (val[x] == val[y] && x > y)) x^=y^=x^=y;
        son[x][1] = Merge(son[x][1], y);
        fa[son[x][1]] = x;
        if(dis[son[x][1]] > dis[son[x][0]]) swap(son[x][1], son[x][0]);
        dis[x] = dis[son[x][1]] + 1;
        return x;
    }
    
    inline void Del(int x){
        val[x] = -1;
        fa[son[x][1]] = fa[son[x][0]] = 0;
        Merge(son[x][1], son[x][0]);
    }
    

    AC with an undescriable magic.

    inline int Find(int x){
        return x == fa[x] ? x : fa[x] = Find(fa[x]);
    }
    
    inline int Merge(int x,int y){
        if(!x) return y;
        if(!y) return x;
        if(val[x] > val[y] || (val[x] == val[y] && x > y)) swap(x, y);
        son[x][1] = Merge(son[x][1], y);
        fa[son[x][0]] = fa[son[x][1]] = x;
        if(dis[son[x][0]] < dis[son[x][1]]) swap(son[x][0], son[x][1]);
        dis[x] = dis[son[x][1]] + 1;
        return x;
    }
    int del[N];
    inline void Del(int x){
        del[x] = true;
        fa[son[x][0]] = son[x][0];
        fa[son[x][1]] = son[x][1];
        fa[x] = Merge(son[x][0], son[x][1]);//QAQ
    	/*
        Ah, it seems as father is not useful for himself anymore, he becomes a rope for his son to climb higher...
    	anyway, this program goes well with this sentence, so who care about the reason.
    	He who laughs last, laughs best...
        */
    }
    

    use struct

    struct LeftTree{
    	int l,r,val,dis;
    }t[N];
    //int son[N][2],fa[N],val[N],dis[N];
    int fa[N];
    inline int Find(int x){
        return x == fa[x] ? x : fa[x] = Find(fa[x]);
    }
    
    inline int Merge(int x,int y){
        if(!x) return y;
        if(!y) return x;
        if(t[x].val > t[y].val || (t[x].val == t[y].val && x > y)) swap(x, y);
        t[x].r = Merge(t[x].r, y);
        fa[t[x].l] = fa[t[x].r] = x;
        if(t[t[x].l].dis < t[t[x].r].dis) swap(t[x].l, t[x].r);
        t[x].dis = t[t[x].r].dis + 1;
        return x;
    }
    
    int del[N];
    inline void Del(int x){
        del[x] = true;
        fa[t[x].l] = t[x].l;
        fa[t[x].r] = t[x].r;
        fa[x] = Merge(t[x].l, t[x].r);//QAQ
    	/*
        Ah, it seems as father is not useful for himself anymore, he becomes a rope for his son to climb higher...
    	anyway, this program goes well with this sentence, so who care about the reason.
    	He who laughs last, laughs best...
        */
    }
    

  • 相关阅读:
    HDU 4611 Balls Rearrangement 数学
    Educational Codeforces Round 11 D. Number of Parallelograms 暴力
    Knockout.Js官网学习(简介)
    Entity Framework 关系约束配置
    Entity Framework Fluent API
    Entity Framework DataAnnotations
    Entity Framework 系统约定配置
    Entity Framework 自动生成CodeFirst代码
    Entity Framework CodeFirst数据迁移
    Entity Framework CodeFirst尝试
  • 原文地址:https://www.cnblogs.com/bingoyes/p/11185861.html
Copyright © 2020-2023  润新知