
平衡树
make_it_for_good
这个作者很懒,什么都没留下…
展开
-
codeforces #366 704B 704C 704D 704E
704C题意:有n个点,第i个点在位置xi,保证对于任意i#include <bits/stdc++.h> using namespace std; #define N 5100 #define ll long long int n,s,e,type; int X[N],a[N],b[N],c[N],d[N]; ll f[N][N]; int main() { scanf("%d%d%d",原创 2016-08-13 19:52:52 · 2050 阅读 · 2 评论 -
bzoj 2329 [HNOI2011]括号修复 splay
区间赋值,区间翻转,区间反转,也就splay能干这些事吧。。。 维护一个区间最小值low,区间最大值up,区间和sum,然后一段区间的答案是 (−low[x]+1)/2+(sum[x]+(−low[x]+1)/2∗2)/2(-low[x]+1)/2+(sum[x]+(-low[x]+1)/2*2)/2再打一坨标记就行了,注意标记重叠#include <bits/stdc++.h> using n原创 2016-12-29 09:15:26 · 412 阅读 · 0 评论 -
bzoj 2300 [HAOI2011]防线修建 splay维护凸包
正常的splay维护凸包不支持删点,把操作倒过来变成加点。 HAOI真心良心呀,边界都给好了。。。#include <bits/stdc++.h> using namespace std; #define N 110000 #define M 210000 #define which(x) (ch[fa[x]][1]==x) int d,n,Q,root; int X[N],Y[N],vis[N]原创 2016-12-28 15:00:35 · 446 阅读 · 0 评论 -
bzoj 2827 千山鸟飞绝 平衡树
splay和我的常数加到一起简直是灾难。。。 坐标没有用,把它离散掉。 然后splay维护一个最大值和次大值和最大size的标记。 插入的时候查询一下,打个标记。#include <bits/stdc++.h> using namespace std; #define N 410000 #define M 810000 #define ll long long #define ls(x) ch原创 2017-01-04 08:10:06 · 862 阅读 · 0 评论 -
bzoj 4071 [Apio2015]巴邻旁之桥 splay
500题留念: 对于不过桥的人在最后加进答里就行了。 一个人过桥一定是先从a到桥再从桥到b。对于K=1的情况,设桥的位置为x,答案就是∑|a[i]−x|+∑|b[i]−x|\sum|a[i]-x|+\sum|b[i]-x|。因此选在所有a和b的中间最优。 对于K!=1的情况,考虑如果当前点选的桥坐标为x,那么对于这个点,答案是−b−a+2x-b-a+2x(a,b都在桥左),|b−a||b-a|原创 2016-12-09 10:13:10 · 523 阅读 · 0 评论 -
bzoj 2733 [HNOI2012]永无乡 splay启发式合并
splay启发式合并#include <bits/stdc++.h> using namespace std; #define N 110000 #define which(x) (ch[fa[x]][1]==x) int n,m,Q; char s[11]; int ft[N],root[N],val[N]; int fa[N],ch[N][2],size[N]; int find(int x){原创 2016-12-08 08:38:07 · 274 阅读 · 0 评论 -
bzoj1895 Pku3580 supermemo splay
裸splay。 写这篇文章的目的在于说明我是一个智障。 woc函数又没写return,被各种编译器坑惨。。。 开-Wall 开-Wall 开-Wall。。。。#include <bits/stdc++.h> using namespace std; #define N 510000 #define ls(x) ch[x][0] #define rs(x) ch[x][1] #define原创 2016-12-12 20:30:04 · 434 阅读 · 0 评论 -
bzoj 3833 [Poi2014]Solar lamps 树套树 splay
首先由于所有灯的角度都是一样的,所以可以用坐标转换把一个点和点的覆盖区域转成平面直角坐标系里的点和一个点右上的区域。 然后这个问题可以转化为平面上一坨点,设一个点的答案为ans,求一个点左下的点中ans第k小的值。 树套树+二分? 这题nlog2nlog^2 都卡得要死你TM跟我讲这个?由于求的东西天生离线所以我们可以排序消掉一维坐标。 然后就是带修求前缀第k大。 树状数组套主席树? 这原创 2016-09-27 17:23:28 · 467 阅读 · 0 评论 -
bzoj 3435 紫荆花之恋 动态树分治+替罪羊+treap
我从未见过如此恶心的树分治。。。。先动态维护这个树的树分治,当一个子树大小太大时,重构这个点和他的所有子树,用树分治分成平均的子树。对于一个插入和查询,在树分治结构中从深度高到深度低遍历。然后统计新插入的点过当前中心,到当前分治结构中的路径。 对于一条从 xx 到 yy 过当前分治中心的路径,设点 xx 距当前分治中心的路径长度为 dis(x)dis(x) 。那么需要满足的条件就是 dis[x]+原创 2016-08-31 16:42:51 · 717 阅读 · 0 评论 -
bzoj 3065 带插入区间K小值 重量平衡treap套主席树
题意:维护一个数列,支持插入,修改,查询区间k小值。我数据结构还是太弱呀QAQ 看了myy的课件和vfk的题解treap支持重量平衡,也就是他插入删除影响的节点数都是O(log)O(log) 的。先说插入,我们先把点插入到最下面,然后往上旋,假设这个点转到祖先k的位置,那么影响节点为sizeksize_k 个,由于这个点的随机权值是sizeksize_k 个点中最小的,这个的概率是1sizek\f原创 2016-08-29 20:05:58 · 781 阅读 · 1 评论 -
bzoj 3545 [ONTAK2010]Peaks 平衡树启发式合并
把所有询问离线下来,从小到大枚举边合并,用并查集维护连通块,每块维护一个平衡树,合并时启发式合并。 一开始写的是splay找前驱后继然后插入TLE,改成插到叶子上才过。不过在官网还是T的。splay常数果然大。。。 这题读入太大,要用读入优化。。。插入时插成叶子:#include <bits/stdc++.h> using namespace std; #define N 110000 #def原创 2017-01-06 19:15:06 · 336 阅读 · 0 评论