众所周知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一定可以被定向叉掉。。。