
treap
WerKeyTom_FTD
这个作者很懒,什么都没留下…
展开
-
用Treap实现Splay和线段树的功能
关于Treap一提到维护序列、可支持分裂合并的平衡树,大家都能想到Splay。不过,实际上Treap也可以支持,而且可以无需任何旋转操作,这使得Treap具备可持久化的特点。 本蒟蒻总感觉Treap=Tree+Heap。合并操作我们可以模仿左偏树的合并方式。分裂操作我们可以像kth操作一样往下,同时拆树,然后通过迭代回来的两个树进行合并。好处注意到Treap每一个操作均为从上至小,我们打标记可以更原创 2015-09-25 19:54:02 · 1496 阅读 · 0 评论 -
[WerKeyTom_FTD的模拟赛]刻画在历史舞台上的群星
某蒟蒻WerKeyTom_FTD的模拟赛第二题《刻画在历史舞台上的群星》原创 2016-11-03 21:17:09 · 2876 阅读 · 0 评论 -
[bzoj2658]小蓝的好友
题目大意求一个n*m网格里有多少矩阵包含至少一个黑格子。 数据保证随机Treap可以想到求有多少矩阵不包含任何黑格子。 直接跑单调栈会TLE。 我们可以针对某一行,每个格子求出其最长上升的距离,得到一个数组up。 然后,对up数组进行笛卡尔树建立。 那么,我们知道对于笛卡尔树中任意一个结点x,其对答案贡献为(h[x]−h[fa[x]])∗size[x]∗(size[x]+1)/2(h[x]原创 2016-06-25 16:47:21 · 911 阅读 · 2 评论 -
[WC2016]鏖战表达式
前言出题人傻逼题目大意是一道交互题。 初始给你一个表达式,运算符编号越大优先级越高。你可以调用F(a,b,x)表示把元素a与b做x运算符运算得到的值。 现有三种操作,修改一个元素的值、修改一个运算符、翻转一个区间,每个操作后需要返回表达式的值。 不能调用F超过10^7次。 要求在线并可持久化。Treap大法好一个显然的想法,每次找到优先级最小的运算符,然后分成两部分递归求解。我们需要维护一颗原创 2016-02-04 16:40:28 · 1804 阅读 · 0 评论 -
关于笛卡尔树及Treap的线性构造法
前言大家到知道笛卡尔树。 而且我们也可以把treap当作笛卡尔树。 现在将介绍笛卡尔树的线性构造法。线性构造维护笛卡尔树从根开始一直往右走的那一条链,这个用单调栈维护。 每次往栈顶的右儿子加点。 然后类似treap一样,就是模拟treap的旋转。 可以看代码理解。fo(i,1,n){ j=0; while (top&&fix[i]<fix[sta[top]]原创 2016-04-06 20:08:01 · 2881 阅读 · 0 评论 -
[bzoj3223]文艺平衡树
题目大意维护序列。 需要兹瓷区间翻转。treap大法好嘿嘿嘿裸题。 注意遍历treap的时候也要down标记啊!#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=100000+10;int left[maxn],right[ma原创 2016-04-06 20:02:48 · 676 阅读 · 0 评论 -
法法塔的奖励
题目大意给定一颗树,求任意结点子树内任意叶子节点到其路径包括该节点的最长不下降子序列的长度的最大值。水你可以搞dfs序 你可以搞Treap的启发式合并 你可以搞线段树合并#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=10000原创 2016-02-27 16:34:36 · 768 阅读 · 0 评论 -
[bzoj3173][TJOI2013]最长上升子序列
题目大意共n次操作,第i次操作在第xi个数后插入数字i并询问当前最长上升子序列。 n<=100000。离线大法好我们可以先处理出最终序列,然后做一次最长上升子序列。假设数字i最终位置为a[i],那么对于第i次询问答案就是f[a[i]]。Treap如果强制在线该怎么办? 那就是一道Treap裸题了。#include<cstdio>#include<algorithm>#include<cstd原创 2016-02-14 11:30:16 · 884 阅读 · 0 评论 -
[bzoj3545]Peaks
题目大意一个图,有边权和点权。若干个询问形如询问从点x出发只能走边权不超过y的边,走到所有点点权第k大是多少。离线大法好显然按照边权从小到大排序,用平衡树启发式合并做就好了。 TLE了,不开森。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cctype>#include<cti原创 2016-03-07 20:25:09 · 770 阅读 · 0 评论 -
[bzoj3600]没有人的算术
题目大意定义一种数,要么是0,要么是一个二元组,这个二元组两元都是数。 定义小于是: 1、0<(l,r) 2、如果x<ax<a,那么(x,y)<(a,b) 3、如果x=a,y<by<b,那么(x,y)<(a,b) 定义等于是: 1、0=0 2、如果x=a,y=b,那么(x,y)=(a,b) 大于与小于类似 现在有一个序列,初始全部为0。 有两种操作: 1、把a[k]修改为(a[原创 2016-10-29 17:36:37 · 1385 阅读 · 0 评论