
平衡树
cjk_cjk
这个作者很懒,什么都没留下…
展开
-
BZOJ3223 文艺平衡树(Splay)
【题意】维护一个有序数列,支持翻转一个区间【代码】#include#includestruct Node{ Node* ch[2]; int v,s,f; int cmp(int x) const { if(x==ch[0]->s+1) return -1; if(xs) return 0; return 1; }};Node *root,*原创 2015-05-14 02:41:44 · 585 阅读 · 0 评论 -
BZOJ3224 普通平衡树(Treap实现名次树)
【题意】Description您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为小于x,且最大的数)6. 求x的后继(后继定义为大于x,且最小的数)Input原创 2015-05-14 02:41:18 · 536 阅读 · 0 评论 -
poj3622 Gourmet Grazers(贪心+Treap)
【题解】将牛和草分别按鲜嫩度从大到小排序 然后将牛扫一遍:对于第i头牛,将鲜嫩度>=b[i]的草的价格加入平衡树,找出价格>=a[i]的最小的草,计入答案并删除之 正确性分析:若i【代码】#include#include#define INF 2000000000typedef long long LL;int a[100005],b[100005]原创 2015-06-21 18:41:59 · 546 阅读 · 0 评论 -
BZOJ3173 [Tjoi2013]最长上升子序列(离线处理+Treap+LIS)
【题解】离线处理:第n个数的插入不会改变前n-1个数的相对位置,因此可以直接求得最终序列,第i次操作的答案就是仅含1~i的LIS 最终序列可以用Treap求得;由于仅含1~i的LIS = max( 仅含1~i-1的LIS , 以i为结尾的LIS ),可以用O(N*logN)的动态规划求出以每个数为结尾的LIS,再递推求出每步答案 【代码】#include#in原创 2015-06-22 11:25:26 · 615 阅读 · 0 评论 -
BZOJ3506 [Cqoi2014]排序机械臂(离散化+Splay)
【题解】题目大意:给定一个n元素数列,n次操作,第i次要求输出第i小的数的当前位置t,再将区间[i,t]翻转 模板题,记录伸展树中 以每个结点为根的子树的最小值,通过它在logN时间内找到最小值的位置,然后提取出序列并打上翻转标记,每次操作结束,将最左边的元素分裂出去,这样每次操作都是找最小值 本题有重复元素,有些麻烦,但题目只让给出位置,可以先离散化去重再处理原创 2015-06-22 16:37:31 · 965 阅读 · 0 评论 -
BZOJ1014 [JSOI2008]火星人prefix(Splay+字符串Hash)
【题解】动态的LCP问题 用 Splay 处理动态区间:插入操作"I x d"的实现:首先将x旋转至树根,则d应插在x的右字树中找到 x的右子树的最左端结点(即原来的s[x+1]在树中的对应结点),将d添加为它的左孩子 用 字符串Hash 判断字符串是否相等:o->H表示由o及其左右子树所对应字母构成的字符串的Hash值,则 o->H = o->ch原创 2015-06-22 21:03:57 · 988 阅读 · 1 评论 -
[NOI2004]郁闷的出纳员(Treap)
【题解】Treap水过注意:对于null结点,不能进行 o->s = o->ch[0]->s + 1 + o->ch[1]->s 操作,一定要考虑此问题【代码】#include#includeint ans=0;struct Node{ Node* ch[2]; int v,r,s; int cmp_v(int x) const { if(x==v) r原创 2015-07-10 19:55:59 · 756 阅读 · 0 评论 -
BOZJ2733 [HNOI2012]永无乡(Treap+启发式合并)
【题解】Treap 启发式合并:初始时给每个点建一个treap,连边时启发式合并,将小的treap的每个结点插入大的treap中,并delete掉多余结点 【代码】#include#includeint fa[100005],num[100005];struct Node{ Node* ch[2]; int v,r,s; int cmp_v(int x)原创 2015-06-21 02:56:01 · 790 阅读 · 0 评论