一个关于treap的想法
查看原帖
一个关于treap的想法
52902
Flying2018楼主2020/10/29 07:49

众所周知treap是基于随机数来实现平衡的。

但是随机数往往并不是那么随机的。可以发现如果我们时刻让随机数等于权值,那么平衡树就变成了一条平衡链。

比如这篇题解就可以用下面这份数据生成器卡掉:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
set<int>s;
int main()
{
    int n=100000;
    printf("%d\n",n);
    rand(),rand();
    for(int i=1;i<=n-1;i++)
    {
        int v=rand();
        if(s.count(v)) printf("2 %d\n",v),++i;
        if(i<=n-1) printf("1 %d\n",v),s.insert(v);
    }
    printf("4 50000");
    return 0;
}

问一下各位大佬有没有过类似的想法?如果这种方法是正确的话,是不是这种treap一定可以被定向叉掉。。。

2020/10/29 07:49
加载中...