zoukankan      html  css  js  c++  java
  • 可持久化数据结构板子整理(可持久化 线段树/字典树/可并堆)

    主席树静态序列查区间第k大

    struct tree{
        int L,R,sum;
    }t[100010];
    void change(int &now,int pre,int l,int r,int k){
        now=++cnt;
        t[now]=t[pre];
        t[now].sum++;
        int mid=(l+r)/2;
        if(l<r){
            if(k<=mid){
                change(t[now].L,t[pre].L,l,mid,k);
            }else{
                change(t[now].R,t[pre].R,mid+1,r,k);
            }
        }
    }
    int query(int xl,int xr,int l,int r,int k){
        if(l==r)return l;
        int x=t[t[xr].L].sum-t[t[xl].L].sum;
        int mid=(l+r)/2;
        if(x>=k){
            return query(t[xl].L,t[xr].L,l,mid,k);
        }else{
            return query(t[xl].R,t[xr].R,mid+1,r,k-x);
        }
    }

    主席树可持久化数组

    struct tree{
        int L,R,w;
    }t[100010];
    void change(int &now,int pre,int x,int y,int l,int r){
        now=++cnt;
        if(l==r){
            t[now].w=y;
            return;
        }
        t[now].L=t[pre].L;
        t[now].R=t[pre].R;
        int mid=(l+r)/2;
        if(x<=mid){
            change(t[now].L,t[pre].L,x,y,l,mid);
        }else{
            change(t[now].R,t[pre].R,x,y,mid+1,r);
        }
        return ;
    }
    int query(int pre,int x,int l,int r){
        if(l==r){
            return t[pre].w;
        }
        int mid=(l+r)/2;
        if(x<=mid){
            return query(t[pre].L,x,l,mid);
        }else{
            return query(t[pre].R,x,mid+1,r);
        }
    }

    可持久化字典树

    struct trie{
        int ch[2],siz,id;
    }t[50000010];
    void change(int &now,int pre,int bit,long long val){
        now=++cnt;
        t[now]=t[pre];
        t[now].siz++;
        if(bit==-1){
            return;
        }
        int i=(val>>bit)&1;
        change(t[now].ch[i],t[pre].ch[i],bit-1,val);
    }
    int query(int a,int b,int bit,long long val){
        if(bit<0){
            return 0;
        }
        int i=(val>>bit)&1;
        if(t[t[b].ch[!i]].siz-t[t[a].ch[!i]].siz>0){
            return (1<<bit)+query(t[a].ch[!i],t[b].ch[!i],bit-1,val);
        }else{
            return query(t[a].ch[i],t[b].ch[i],bit-1,val);
        }
    }

    可持久化可并堆

    struct Heap{
        int ls,rs,dist;  
        int w;
    }t[3000010];
    int merge(int x,int y){
        if(!x||!y)return x+y;
        if(t[x].w>=t[y].w)swap(x,y);
        int p=++cnt;
        t[p]=t[x];
        t[p].rs=merge(t[p].rs,y);
        if(t[t[p].ls].dist<t[t[p].rs].dist)swap(t[p].ls,t[p].rs);
        t[p].dist=t[t[x].rs].dist+1;
        return p;
    }
    int newheap(int w,int to){
        int x=++cnt;
        t[x].w=w;
        t[x].dist=1;
        return x;
    }
  • 相关阅读:
    仿函数(functor)
    七周七语言
    面向签名编程
    git checkout简介
    .gitkeep常用写法
    PhpStorm terminal无法输入命令的解决方法
    原 在windows上创建文件名以“.”开头的文件
    cmd 里面运行git提示“不是内部或外部命令,也不是可运行的程序”的解决办法
    .gitkeep
    git/github运用
  • 原文地址:https://www.cnblogs.com/passione-123456/p/11788175.html
Copyright © 2011-2022 走看看