https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列中插入某个数,则要SplitRank到正确的位置. 注意SplitRank的写法以及Pushdown的东西. #include<bits/stdc++.h> using namespace std; typedef long long ll; #define ls(p) ch[p][0] #def…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 因为涉及到增加和修改,所以后缀数组就被pass掉了,想到的就是平衡树维护hash值,查询的时候就是二分相同的长度来比较,修改就是删除再增加. 这里使用的是无旋Treap #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int ull; ; int Siz[ma…
https://www.luogu.org/problem/P4008 无旋Treap也可以维护序列. 千万要注意要先判断p节点存在才进行Show操作,不然输出一个'\0'(或者RecBin里面的东西)草. 假如有限制同时存在的节点数量的话,UnBuild操作是显得重要的. 当然这里最主要的是类似笛卡尔树的O(n)建立Treap树. #include<bits/stdc++.h> using namespace std; typedef long long ll; #define ls(p)…
fhq板子(代码正确且风格易懂) 洛谷P3369 #include<iostream> #include<cstring> #include<cstdio> #include<ctime> #include<cstdlib> using namespace std; const int N = 105000; int val[N], son[N][2]; int rnd[N], tot, n; int siz[N], root, a, p, x,…