平衡树
里阿奴摩西
这个作者很懒,什么都没留下…
展开
-
[Splay] BZOJ 3729 Gty的游戏
"题解:博弈论+Splay维护dfs序想会做这道题首先要知道两个Nim游戏的经典变形。第一个是加入一次只能选m个的限制。第二个是“阶梯博弈”(POJ 1704),就是有一个楼梯,每次可以把一阶的任意个棋子移到下面一个台阶,不能移动(0号台阶不能向下移动)的玩家输。第一个问题的解决方法是把所有的数 mod (m+1),因为显然加入这个限制之后每个子游戏的sg函数值变成了sg(原创 2016-03-13 14:09:21 · 672 阅读 · 0 评论 -
[均摊 平衡树 || 线段树] HDU 5634 Rikka with Phi
用平衡树维护 分析同 [均摊 平衡树 || 线段树] Codeforces 438D #250 (Div. 1) D. The Child and Sequence#include#include#includeusing namespace std;typedef long long ll;inline char nc(){ static char buf[100原创 2017-01-19 11:45:28 · 456 阅读 · 0 评论 -
[Splay模拟 线段树 || Splay || LCT] HDU 4942 Game on S♂play
做法颇多算法一形式化地描述要进行什么操作。旋转节点:link/cut 。更改两个点的子树和:单点修改。询问一个点子树内子树和的积:子树询问。可以在LCT上维护轻儿子信息(小Toptree),这样就可以子树询问了。轻重边切换的时候顺便维护这个。复杂度O(n log n),期望得分70 - 100分。算法二子树询问的是积,具有可减性。可以转化原创 2016-07-16 17:57:19 · 703 阅读 · 0 评论 -
[Treap模拟 线段树] Codechef COT5 Count on a Treap
传送门Description在计算机科学中,Treap根据键值是一棵二叉搜索树,根据权值是一个堆(本题中为大根堆) 。 你的任务是维护一棵Treap,支持以下操作0 k w 插入一个新节点,键值为k,权值为w。1 k 删除键值为k的节点。2 ku kv 输出键值为ku和kv的两个点之间的路径长度。保证没有两个点键值相同或权值相同,并且删除一个点时该点存在。Analysis考虑如何是如何建T原创 2017-03-01 21:09:44 · 963 阅读 · 0 评论 -
[Treap 笛卡尔树 扫描线 补集转化] BZOJ 2658 [Zjoi2012]小蓝的好友(mrx)
这个先转化成全部矩形 C2R+1∗C2C+1C_{R+1}^2*C_{C+1}^2 减去不包含点的矩形 我们考虑扫描线 也就是以当前直线作为右边界的矩形有多少个 对于每个纵坐标 设h表示最左能扩展到哪里 假设hmin(1,n)=hxh_{min (1,n)}=h_x 那么答案至少应该C2C+1∗hminC_{C+1}^2*h_{min} 然后还要加上C2x−1∗(hmin(1,x−1)−原创 2017-02-14 10:53:17 · 877 阅读 · 0 评论 -
[替罪羊树 模板题] BZOJ 3224 Tyvj 1728 普通平衡树
替罪羊树的模板题 关于删除 有人说按照BST的方法删 那样讨论太烦啦 直接打个标记表示已被删 下次重构的时候丢掉就好了#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if原创 2017-01-29 22:06:06 · 795 阅读 · 0 评论 -
[替罪羊树 动态标号 线段树] BZOJ 3600 没有人的算术
好题啊 首先肯定是线段树 那么考虑我们怎么比较两个数的大小 采用CLJ在重量平衡树和后缀平衡树在信息学奥赛中的应用中提到的标号思想 不妨令每个节点表示一个区间 用区间的中值代表这个数的大小 具体实现是我们不仅要给每个点记录 l,r,mid 还要记录 x y 表示他等价于(x,y)的组合 因为新插入数是没有标号的 只能按定义比较first和second 注意0小于任何数 我没想到好的方法原创 2017-01-29 22:11:58 · 536 阅读 · 0 评论 -
[Treap套权值线段树 线段树分裂与合并] BZOJ 4552 [Tjoi2016&Heoi2016]排序
线段树合并写了不少 分裂是第一次 直接每一个有序区间用一棵权值线段树维护有哪些数 外层用treap维护顺序 然后排序就把代表这段的很多颗线段树合并在一起 两端处会割开某个有序区间 会涉及分裂操作#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static原创 2017-01-30 19:34:55 · 1333 阅读 · 0 评论 -
[替罪羊树 动态点分治 替罪羊式重构] BZOJ 3435 [Wc2014]紫荆花之恋 & UOJ #55 【WC2014】紫荆花之恋
网上题解都说的很详细了吧 考虑点分治 dist(i,j)≤Ri+Rjdist(i,j) ≤ R_i+R_j 可以转化成Dj−Rj≤Ri−DiD_j-R_j ≤ R_i-D_i 其中DiD_i表示到重心的距离 开两颗平衡树维护 一颗统计 一颗去重 然后 因为要动态加点 点分树的性质不能保证 所以当一个子树的大小超过某个阈值时 就把点分树替罪羊式重构下 说起来真轻巧#include<cs原创 2017-02-26 19:19:02 · 582 阅读 · 0 评论 -
[DP 平衡树] Codeforces 809D Round #415 (Div. 1) D. Hitchhiking in the Baltic States
考虑求lis的过程 fif_i表示长度为ii的递增子序列最末尾一项的最小值 这个东西是单调递增的 每次在序列后加入一个数 就更新下相应的一个位置 现在变成加入的数可以是一个区间内 那么我们发现会对一段产生影响 平衡树维护下就好了#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline c原创 2017-05-23 21:32:59 · 726 阅读 · 0 评论 -
[均摊 平衡树 || 线段树] Codeforces 438D #250 (Div. 1) D. The Child and Sequence
传说中的cf250 china场题意就是区间取模 区间求和 单点修改每个数被取模了 肯定会减小一半 一个数最多只要log次就能不动把相同的数缩成一段每一段最多被修改O(log n) 次每一次修改会增加O(1) 段用平衡树维护 复杂度是 nlog2n 的对应的势能函数是每一段的log值的和总势能是(n+m)logn每次操作log复杂度 能够降1那么就是两个lo原创 2017-01-19 11:41:12 · 528 阅读 · 0 评论 -
[非旋转Treap 权值线段树] 2016 计蒜之道 初赛 第五场 腾讯的新游戏
可以发现对于每个队伍 最小需要的防御值是max(ai-i+1)因为打到第i个时已经加了i-1防御 然后所有队伍从小到大排序后 答案求法亦然那么我用treap维护每个队列 用权值线段树维护答案#include#include#includeusing namespace std;inline char nc(){ static char buf[100000原创 2016-11-10 07:00:47 · 379 阅读 · 0 评论 -
[非旋转Treap 神奇复杂度分析] Hillan模拟赛 D.理性愉悦
将所有询问建成一颗平衡树每次分裂成两棵 右边打个减标记然后怎么合并呢要是右边最小值大于左边最大值 那么直接合并要是不呢 我们不断从右边弹出最小插入左边 直到可以合并暴力合并的复杂度怎么证呢可以通过与prize的关系 发现右边的数减去prize后肯定小于原来的一半 每个数最多从右边到左边log次复杂度就是nlogn了#include#include#原创 2016-10-23 10:34:14 · 743 阅读 · 0 评论 -
[Splay] NOI2005 维修数列
BZOJ 1500不想说有多心酸#include#include#include#includeusing namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,原创 2016-03-13 19:10:54 · 487 阅读 · 0 评论 -
[平衡树 启发式合并] BZOJ 1483 [HNOI2009]梦幻布丁
用set水过的搬运下黄学长的复杂度分析吧,很有道理啊每次我们把短的合并到长的上面去,O(短的长度)咋看之下没有多大区别,下面让我们看看均摊的情况:1:每次O(N)2:每次合并后,队列长度一定大于等于原来短的长度的两倍。这样相当于每次合并都会让短的长度扩大一倍以上,最多扩大logN次,所以总复杂度O(NlogN),每次O(logN)。原创 2016-05-02 13:26:36 · 761 阅读 · 0 评论 -
[线段树套平衡树] BZOJ 2883 gss2加强版
每个数支持出现一次 那么给每个数再赋一个权值pre每次查询只要查[L,R]中pre结果splay被卡了 打了个treap#include#include#include#include#define N 100010using namespace std;typedef long long ll;inline char nc(){ static char b原创 2016-05-16 21:30:41 · 594 阅读 · 0 评论 -
[Set 单调] BZOJ 2926 [Poi1999]空立方体问题
先考虑二维上的问题 然后就很好想到三维了没有SPJ真蛋疼#include#include#include#includeusing namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2原创 2016-06-19 14:14:40 · 626 阅读 · 0 评论 -
[平衡树动态维护凸包] BZOJ 2300 [HAOI2011]防线修建
就是叉积乱搞 set水过#include#include#include#include#include#includeusing namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,原创 2016-05-29 21:34:01 · 749 阅读 · 0 评论 -
[线段树 Treap] BZOJ 2770 YY的Treap
hzwer:首先询问的两个点的key是一个区间则lca的key是在这个区间内pri最小的那么就变成了维护一个集合支持查询区间最值,加入删除元素#include#include#include#includeusing namespace std;typedef long long ll;inline char nc(){ static char b原创 2016-07-28 08:21:13 · 523 阅读 · 0 评论 -
[DP 斜率优化 CDQ分治||动态维护凸包] BZOJ 1492 [NOI2007]货币兑换Cash
打了个set维护凸包 cdq等待填坑#include#include#include#include#include#include#define dprintf(...) fprintf(stderr,__VA_ARGS__)using namespace std;//typedef long double ld;typedef double ld;inline原创 2016-08-08 22:15:24 · 684 阅读 · 0 评论 -
[扫描线 set] BZOJ 4561 [JLoi2016]圆的异或并
这道题算什么 这道题才可怕:[扫描线 树链剖分 树状数组] BZOJ2758 [SCOI2012]Blinker的噩梦原创 2016-08-23 18:09:12 · 918 阅读 · 0 评论 -
[三合一 BFS 平衡树 线段树] BZOJ 2158 Crash 的旅行计划
无耻的三合一详见Claris博客:http://www.cnblogs.com/clrs97/p/4403250.html原创 2016-08-23 18:23:49 · 706 阅读 · 0 评论 -
[平衡树 模拟] SnackDown 2017 Online Elimination Round #WIQ Waiting in a Queue
直接模拟下这个队列就好了 下一个处理的事件应该是第一个bi−i≤t−1b_i-i\le t-1的人 平衡树维护bi−ib_i-i#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#define cl(x) memset(x,0,sizeof(x))using namespace std;type原创 2017-06-06 15:11:37 · 478 阅读 · 0 评论