平衡树
DZYO
Never stop
展开
-
bzoj1588(hnoi2002)营业额统计 (Splay Treap 平衡树)
Description营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时原创 2017-03-23 13:23:56 · 301 阅读 · 0 评论 -
BZOJ2989: 数列(二进制分组/KDtree+替罪羊)
传送门题意: (稍微转化一下)每次加一些点,在一个正方形内查询点的个数。题解: 先坐标旋转做成矩形查询,然后比较直观的是KDtree+替罪羊暴力重建KDtree+替罪羊暴力重建。 Code:https://paste.ubuntu.com/26306229/还有一种厉害的方法:分治。比较明显的是可以CDQ分治+ 主席树,另外还可以对这些点对做二进制分组。每次暴力重建的复杂度为原创 2018-01-03 21:19:57 · 813 阅读 · 0 评论 -
LOJ#6109. 「2017 山东二轮集训 Day4」增添(可持久化Treap)
传送门题意: 对于一个长度为n的序列,要求支持三种操作: [l,r][l, r]增加xx [l,l+x] [l,l+x] 替换[r,r+x] [r, r + x] [l,r][l,r] 求和题解: 看到第二个操作,想到可持久化这个序列,可以用无旋Treap\text{Treap}来可持久化。可持久化平衡树支持各种操作,包括区间反转,下传等,只需要pushdown\text原创 2018-01-15 21:43:33 · 436 阅读 · 0 评论 -
BZOJ3224:普通平衡树(Treap)
传送门只是用来存模板的(因为紫荆花之恋写无旋的T了)#include <bits/stdc++.h>using namespace std;inline int rd() { char ch=getchar(); int i=0,f=1; while(!isdigit(ch)) {if(ch=='-')f=-1; ch=getchar();} w...原创 2018-02-26 12:19:06 · 183 阅读 · 0 评论 -
BZOJ4447: [Scoi2015]小凸解密码(平衡树)
传送门题解: 预处理所有bibib_i,每次询问相当于修改单点,修改相当于修改两个点。用平衡树维护所有0的位置,有连续的则合并。 找的时候直接找最接近i+2ni+2ni+\frac{2}{n}的地方。 为了细节少一点,找到了之后暴力往两边挪动几位取min就可以了。#include <bits/stdc++.h>using namespace std;typedef...原创 2018-02-20 17:10:17 · 562 阅读 · 0 评论 -
Codeforces Round #240 (Div. 1) E:Mashmokh's Designed Problem(Splay+欧拉序)
传送门题解: 用Splay维护欧拉序。欧拉序有如下性质: 1.深度随着距离加减一。 2.两点间(任意出入栈序)的深度最小值为lca的深度加一。 3.出入栈之间为整个子树。有了如上性质,直接维护欧拉序即可。注意三操作可以直接在Splay 上二分从而少一个lognlogn\log n。#include <bits/stdc++.h>using namespa...原创 2018-03-09 21:05:48 · 279 阅读 · 0 评论 -
雅礼2017 WC模拟(1.19) :哲学题(Splay)
题意: 树木仙有一棵根节点为 111 的菊花树 (除 111 号节点外所有节点的父亲都是 111). 这棵树每个节 点都有一个权值, 最开始 i 号节点的权值为 valivalival_i . 树木仙觉得菊花树不够美观, 决定修改这棵树. 树木仙每次会将编号在 [l,r][l,r][l,r] 之间的节点的 父亲修改为xxx. 因此, 这棵树的形态会不断改变. 为了保证美观...原创 2018-03-20 21:03:11 · 542 阅读 · 3 评论 -
BJ模拟:巡游计划(线段树分治+动态凸包 / 李超线段树)
传送门题意: fi=minj=i−ki−1{fj+aj+|pi−pj|∗bj}fi=minj=i−ki−1{fj+aj+|pi−pj|∗bj}f_i = \min_{j=i-k}^{i-1} \{f_j+a_j+|p_i-p_j|*b_j\}求fnfnf_n。题解: 对于kkk的限制,采用线段树分治来解决: 把每个点影响的区间放到线段树上,查询的区间也放到线段树上,保证处理这个区...原创 2018-04-12 23:02:49 · 360 阅读 · 0 评论 -
Codechef : TASUFFIX
传送门题解: 我们只需要考虑SA上连续的两个位置能否相等即可。 因为最多只能增加1,设这样的位置个数ppp,最终答案为2p2p2^p。我们发现连续的一段很容易判断,用平衡树维护即可。 不连续的地方判断一下位置大小即可。#include <bits/stdc++.h>using namespace std;const int RLEN=1<<18|1;...原创 2018-07-03 22:27:09 · 346 阅读 · 0 评论 -
BZOJ2391:Cirno的忧郁(无旋Treap+三角剖分)
传送门题意: 给n个点,m个物品,每个物品有一个权值,求从这n个点中选出若干点能圈住的物品权值和。n≤2000,m≤2000n\le 2000,m\le 2000题解: 先预处理n个点两两点对与原点组成的三角形能圈住的物品总和sum[i][j]sum[i][j](顺时针为正,逆时针为负)。然后就可以用求多边形面积的经典方法求解,主要是怎么处理第一部分:观察可得,按到原点的极角排序后,两点能圈住的原创 2017-10-07 16:51:48 · 429 阅读 · 0 评论 -
BZOJ1035: [ZJOI2008]Risk(最小左转法+点定位)
传送门题意: 给一个平面图和图上的一些点,问这些点与哪些点在相邻的区域。题解:首先用最小左转法确定每一条线左边的区域。 接下来用扫描线做最小点定位。 最后统计在相邻区域的点对即可。有一个比较难处理的地方是区域相互包含,一开始不知道怎么做就去膜了Claris题解,发现对于每个不同的联通块,确定最左上方的点,做一遍扫描线,之后内层向外层连一条边就好了。 还有凸包的比较函数比较难调(我调了两天。。原创 2017-11-23 15:35:14 · 708 阅读 · 0 评论 -
bzoj1014: [JSOI2008]火星人prefix(Splay)
Description火星人最近研究了一种操作:求一个字串两个后缀的公共前缀。比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 11 字符 m a d a m i m a d a m 现在, 火星人定义了一个函数LCQ(x, y),表示:该字符串中第x个字符开始的字串,与该字符串中第y个字符开始的字串 ,两原创 2017-04-01 16:46:55 · 426 阅读 · 0 评论 -
BZOJ 1503 [NOI2004] :郁闷的出纳员(Splay)
Description OIER 公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。 工资的频繁调整很让员工反感,原创 2017-07-02 11:06:59 · 336 阅读 · 0 评论 -
poj3580:SuperMemo(块状链表/Splay)
传送门题意:题目要求实现一种数据结构,支持6种操作: add x,y D:第x个数到第y个数之间的数每个加D; reverse x y:第x个数到第y个数之间全部数翻转; revolve x y T:第x个数到第y个数之间的数,向后循环流动T次,即后面T个数变成这段子序列的最前面T个,前面的被挤到后面。 Insert x P:在第x个数后面插入一个数P。 Delete x:删除第x个数原创 2017-07-17 21:47:21 · 358 阅读 · 0 评论 -
BZOJ1500: [NOI2005]维修数列(平衡树)
传送门 题意: 平衡树的一系列操作。题解: Splay/无旋Treap Splay:#include<bits/stdc++.h>using namespace std;struct IO{ streambuf *ib,*ob; inline void init(){ ios::sync_with_stdio(false); cin.tie原创 2017-09-28 21:23:15 · 290 阅读 · 2 评论 -
BZOJ1249:SGU277 HERO 动态凸包(set)
传送门题意: 维护一个凸包,支持动态加点。题解: set维护上下凸包,代码稍微有点麻烦。注意设置比较函数的时候上下凸包应该一样,才能保证正确的弹出。#include<bits/stdc++.h>using namespace std;typedef long long ll;struct IO{ streambuf *ib,*ob; inline void init(){原创 2017-10-07 21:35:41 · 760 阅读 · 1 评论 -
BZOJ3224: Tyvj 1728 普通平衡树(无旋Treap/替罪羊)
传送门题意: 平衡树的一系列操作。题解:无旋Treap作为一个用Splay水过无数道题的人,第一次写无旋Treap表示很慌。。#include<bits/stdc++.h>using namespace std;typedef unsigned int uint;struct IO{ streambuf *ib,*ob; inline void init(){原创 2017-09-28 11:02:35 · 334 阅读 · 1 评论 -
BZOJ3065: 带插入区间K小值(替罪羊树+权值线段树)
传送门题意: 带插入区间K小值题解: 替罪羊树+权值线段树,替罪羊的每一个节点维护子树的权值线段树,暴力重建即可。 每次插入复杂度O(log2n)O(\log^2n),查询O(log2n)O(\log^2n)#include<bits/stdc++.h>using namespace std;struct IO{ streambuf *ib,*ob; inline voi原创 2017-09-30 07:44:44 · 436 阅读 · 0 评论 -
Codeforces Round #443 (Div. 2) D,E
看了题解发现做题的时候比较智障。D: 给一个长度为n的序列,每个序列有一个颜色aia_i,重复m次,一旦相同的颜色连续的长度大于k,这段就将被消除,求最终序列的长度。 Sol: First, let’s see what happens inside one bus. We can use a stack containing pairs (city, number of participa原创 2017-10-28 10:08:57 · 426 阅读 · 0 评论 -
Codevs1273:风战(计算几何,平衡树)
传送门题意: 给PP个黑点和TT个白点(纵坐标均大于0),要求选择一个包含原点的凸多边形,使得凸多边形内黑点个数减去白点个数最大。题解: 先把所有点按照到原点的极角排序。 暴力的O(n3)O(n^3)做法: O(n3)O(n^3)预处理两点与原点构成三角形中点的个数。 f[i][j]f[i][j]表示第ii个点从第jj个点转移过来的最大值,那么枚举每个点从前面合法的状态(顺时针旋转)转移过原创 2017-11-24 11:25:34 · 282 阅读 · 0 评论 -
UOJ#57:[WC2013]平面图(最小左转法+点定位)
传送门 在一个平面图中有 nn 个顶点和 mm 条直线段,第 ii 个顶点的坐标为 (xi,yi)(xi,yi),第 jj 条直线段连接顶点 uju_j 和顶点 vjv_j。权值为 hjh_j,除顶点 uju_j 和 vjv_j 外直线段 jj 不经过其他的顶点。任意两条直线段如果存在公共点,则该公共点一定是一个顶点,此时这两条直线段都会连接这个顶点。对于任意的两个顶点 xx 和 yy,总是可以原创 2017-11-24 20:56:32 · 957 阅读 · 0 评论 -
Atcoder AGC014F : Strange Sorting(Treap)
传送门题解:老年选手不会正解,只能用暴力卡卡常了。这样的操作过不了多久就是连续的几段在挪,用Treap+二分即可水过。#include &amp;lt;bits/stdc++.h&amp;gt;using namespace std;#define debug pt(rt),cerr&amp;lt;&amp;lt;'\n'const int RLEN=1&amp;lt;&amp;lt;原创 2018-10-25 08:06:19 · 306 阅读 · 1 评论