可持久化fhq-treap学习笔记

可持久化fhq-treap----- 支持查询历史版本的非旋treap

luogu扣图:

先看看为啥他可以可持久化

由于fhq-Treap是没有旋转操作的
所以每次操作后的其它没有操作的节点间的关系不变
而有旋转平衡树是要改变的,所以就不大能进行可持久化了

过程

回想,主席树的方法:
每次用log的内存记录一次操作
这可持久平衡树也一样
每次merge或者split都新开节点记录路径
路径是log级的,所以内存也在nlogn的级别(当然不是nlog,是操作log)
还是用结构体吧,容易赋值
其实也就是加了几句话
其实也就是和主席树差不多
其实也没啥说的,看代码去吧

别的

SovietPower:一点(很小的)优化? 操作3.4.5.6都不会改原树,root[i]=root[ver]可以直接赋值,不需要再Merge了
xx:为什么
SovietPower:你的合并操作的内存都是新开的,但你这一次操作(是opt的操作辣)是没有改变任何值,所以你直接用上一次的就好,拆开的内存不用管就好

注意&&出错&&吐槽

我们截取merge函数的一部分

    if(e[x].pri<e[y].pri) {
        int p=++cnt;
        e[p]=e[x];
        rs(p)=merge(rs(p),y);
        pushup(p);
        return p;
    }
}

那是不是可以写成

    if(e[x].pri<e[y].pri) {
        int p=++cnt;
        e[p]=e[x];
        rs(p)=merge(rs(p),y);
        pushup(p);
        return p;
    }

当然是不对的啊,你还要递归呢,cnt当然要变化了
这数组模拟内存浪费的有点多呀,指针应该就没这毛病了,不过我还是学不下去指针233

模板->luoguP3835代码

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#define ls(x) e[x].ls
#define rs(x) e[x].rs
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=500007;
const int inf=0x7fffffff;
int read() {
    int x=0,f=1;char s=getchar();
    for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    return x*f;
}
struct node {
    int ls,rs,size,val,pri;
}e[maxn*50];
int cnt,rt[maxn*50];
void pushup(int x) {
    e[x].size=e[ls(x)].size+e[rs(x)].size+1;
}
int make_edge(int x) {
    e[++cnt].val=x;
    e[cnt].size=1;
    e[cnt].pri=rand();
    return cnt;
}
int merge(int x,int y) {
    if(!x||!y) return x+y;
    if(e[x].pri<e[y].pri) {
        int p=++cnt;
        e[p]=e[x];
        rs(p)=merge(rs(p),y);
        pushup(p);
        return p;
    }
    else  {
        int p=++cnt;
        e[p]=e[y];
        ls(p)=merge(x,ls(p));
        pushup(p);
        return p;
    }
}
void split(int now,int k,int &x,int &y) {
    if(!now) x=y=0;
    else {
        if(e[now].val<=k) {
            e[x=++cnt]=e[now];
            split(rs(now),k,rs(x),y);
            pushup(x);
        }
        else {
            e[y=++cnt]=e[now];
            split(ls(now),k,x,ls(y));
            pushup(y);
        }
    }
}
inline int k_th(int now,int k) {
    while(233) {
        if(k==e[ls(now)].size+1) return now;
        if(k<=e[ls(now)].size) now=ls(now);
        else k-=e[ls(now)].size+1,now=rs(now);
    }
}
int main() {
    int n=read(),x,y,z;
    FOR(i,1,n) {
        int tim=read(),opt=read(),a=read();
        rt[i]=rt[tim];
        if(opt==1) {
            split(rt[i],a,x,y);
            rt[i]=merge(merge(x,make_edge(a)),y);
        } else if(opt==2) {
            split(rt[i],a,x,z);
            split(x,a-1,x,y);
            y=merge(ls(y),rs(y));
            rt[i]=merge(merge(x,y),z);
        } else if(opt==3) {
            split(rt[i],a-1,x,y);
            printf("%d\n",e[x].size+1);
            rt[i]=merge(x,y);
        } else if(opt==4) {
            printf("%d\n",e[k_th(rt[i],a)].val);
        } else if(opt==5) {
            split(rt[i],a-1,x,y);
            if(e[x].size) {
                printf("%d\n",e[k_th(x,e[x].size)].val);
                rt[i]=merge(x,y);
            }
            else printf("%d\n",-inf);
        } else {
            split(rt[i],a,x,y);
            if(e[y].size) {
                printf("%d\n",e[k_th(y,1)].val);
                rt[i]=merge(x,y);
            }
            else printf("%d\n",inf);
        }
    }
    return 0;
}
全部评论

相关推荐

赛博小保安:你这简历没啥大问题的,经历技能也足够了,问题应该就是出在出身了,学院本就是这样,HR忙着跟92的勾搭呢,哪有心思看我们这些双非😿😭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 你的mentor是什么样的人? #
3717次浏览 27人参与
# 你觉得mentor喜欢什么样的实习生 #
10077次浏览 283人参与
# 未岚大陆求职进展汇总 #
23792次浏览 111人参与
# 帮我看看,领导说这话什么意思? #
6032次浏览 25人参与
# 没有家庭托举的我是怎么找工作的 #
12176次浏览 156人参与
# 怎么给家人解释你的工作? #
1337次浏览 16人参与
# 智慧芽求职进展汇总 #
17655次浏览 105人参与
# 求职低谷期你是怎么度过的 #
5145次浏览 91人参与
# 26届秋招公司红黑榜 #
11674次浏览 40人参与
# 从哪些方向判断这个offer值不值得去? #
6482次浏览 91人参与
# 同bg的你秋招战况如何? #
158802次浏览 927人参与
# 度小满求职进展汇总 #
10039次浏览 49人参与
# 实习必须要去大厂吗? #
146581次浏览 1541人参与
# 校招泡的最久的公司是哪家? #
4431次浏览 20人参与
# 你有哪些缓解焦虑的方法? #
37172次浏览 835人参与
# 面试紧张时你会有什么表现? #
1682次浏览 20人参与
# 你喜欢工作还是上学 #
77564次浏览 860人参与
# 入职第一天,你准备什么时候下班 #
85462次浏览 467人参与
# 秋招想进国企该如何准备 #
97702次浏览 487人参与
# 简历无回复,你会继续海投还是优化再投? #
103572次浏览 819人参与
# 机械人的工作环境真的很差吗 #
24991次浏览 119人参与
# 独居后,你的生活是更好了还是更差了? #
28125次浏览 263人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务