zoukankan      html  css  js  c++  java
  • 【Splay】bzoj3223 Tyvj 1729 文艺平衡树

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<stack>
    using namespace std;
    #define maxn 100010
    #define INF 2147483647
    int fa[maxn],val[maxn],c[maxn][2],root,tot,siz[maxn],cnt[maxn],val2[maxn];
    bool delta[maxn];
    void Maintain(int x)
    {
        siz[x]=siz[c[x][0]]+siz[c[x][1]]+cnt[x];
    }
    void Mark(int x){
        if(x){
            delta[x]^=1;
        }
    }
    void pushdown(int x){
        if(delta[x]){
            Mark(c[x][0]);
            Mark(c[x][1]);
            swap(c[x][0],c[x][1]);
            delta[x]=0;
        }
    }
    void NewNode(int &x,int Fa,int key,int key2)
    {
        x=++tot;
        fa[x]=Fa;
        c[x][0]=c[x][1]=0;
        val[x]=key;
        val2[x]=key2;
        siz[x]=cnt[x]=1;
    }
    void Rotate(int x,bool flag)
    {
        int y=fa[x];
        c[y][!flag]=c[x][flag];
        fa[c[x][flag]]=y;
        if(fa[y]){
            c[fa[y]][c[fa[y]][1]==y]=x;
        }
        fa[x]=fa[y];
        c[x][flag]=y;
        fa[y]=x;
        Maintain(y);
        Maintain(x);
    }
    stack<int>st;
    void Splay(int x,int goal)
    {
        pushdown(x);
        if(!x || x==goal){
            return;
        }
        int U=x;
    	while(U!=root){
    		st.push(U);
    		U=fa[U];
    	}
    	st.push(U);
    	while(!st.empty()){
    		pushdown(st.top());
    		st.pop();
    	}
        int y;
        while((y=fa[x])!=goal){
            if(fa[y]==goal){
                Rotate(x,c[y][0]==x);
            }
            else{
                if((c[y][0]==x)==(c[fa[y]][0]==y)){
                    Rotate(y,c[fa[y]][0]==y);
                }
                else{
                    Rotate(x,c[y][0]==x);
                    y=fa[x];
                }
                Rotate(x,c[y][0]==x);
            }
        }
        Maintain(x);
        if(!goal){
            root=x;
        }
    }
    int Find(int key,int x=root)
    {
        while(c[x][val[x]<key]){
            if(val[x]==key){
                return x;
            }
            x=c[x][val[x]<key];
        }
        return x;
    }
    void Insert(int key,int key2)
    {
        if(!root){
            NewNode(root,0,key,key2);
            return;
        }
        int x=Find(key);
        if(val[x]==key){
            ++cnt[x];
            Splay(x,0);
            return;
        }
        NewNode(c[x][val[x]<key],x,key,key2);
        Splay(c[x][val[x]<key],0);
    }
    int Kth(int K,int x=root)
    {
        while(1){
            pushdown(x);
            int Siz0=siz[c[x][0]];
            if(K<=Siz0){
                x=c[x][0];
            }
            else if(K<=Siz0+cnt[x]){
                break;
            }
            else{
                K-=(Siz0+cnt[x]);
                x=c[x][1];
            }
        }
        return x;
    }
    void print(int x)
    {
        if(!x){
            return;
        }
        pushdown(x);
        print(c[x][0]);
        printf("%d ",val2[x]);
        print(c[x][1]);
        Maintain(x);
    }
    int n,m;
    int main(){
        scanf("%d%d",&n,&m);
        Insert(0,0);
        for(int i=1;i<=n;++i){
            Insert(i,i);
        }
        Insert(n+1,n+1);
        int x,y;
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            Splay(Kth(x),0);
            Splay(Kth(y+2),root);
            Mark(c[c[root][1]][0]);
        }
        Splay(Kth(1),0);
        Splay(Kth(n+2),root);
        print(c[c[root][1]][0]);
        return 0;
    }
  • 相关阅读:
    中国区 Azure 服务和定价模式概述
    云计算的那些「What」
    【虚拟机-可用性集】ARM 中可用性集使用的注意事项
    【虚拟机-可用性集】将虚拟机添加到可用性集中
    【虚拟机-远程连接】Azure Linux 虚拟机常见导致无法远程的操作
    【虚拟机-远程链接】Azure Windows 虚拟机常见导致无法远程的操作
    【虚拟机-网络IP】使用 Powershell 设置 VNET 中的静态 IP
    matlab的diff()函数
    matlab的拟合函数polyfit()函数
    解决Python各种no module named "XX"的问题
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7182744.html
Copyright © 2011-2022 走看看