数据结构
Richard_for_OI
老年退役选手orz
展开
-
重量平衡树之替罪羊树
替罪羊树的思想,就是每次操作都直接做。然后找这条改动路径上的所有点,找到离root最近,且不平衡的节点,重构这棵子树。平衡的定义:size(lson) ≤ alpha * size且size(rson) < alpha * size。alpha∈(0.5, 1),一般取0.75。时间复杂度应该是均摊的,O(nlogn)。重量平衡树在实际操作时就有很多好处(比如我心爱的treap)。就比如bz...原创 2018-05-09 21:38:23 · 498 阅读 · 0 评论 -
线段树优化建图
有一种最短路问题,有的边是从区间到区间的,这个时候点操作就不是很好办(边比较多)。于是考虑建线段树优化建图。两颗线段树:入与出。(出表示从这里出发,入表示进到了这个点)于是每条区间加边就可以转为log级别。1、平行节点间,从入连向出一条0边(进入了这个点,当然可以从这个点出发)。2、入线段树中,每个点都像左右儿子区间连0边(进入了这个区间,也可以认为进入了区间的子集)。3、出线段树每个点都像父亲连...原创 2018-05-10 22:07:47 · 2603 阅读 · 0 评论 -
洛谷P3242 HNOI2015 接水果
也是我做的第一个整体二分题吧。主要是要分析每一个盘子的贡献。包含path(u, v)这条路径的路径,记为(x, y)。(u比v的dfn小,x比y的小)那么有两种情况。①u不是v的祖先此时,x与y势必要分别为u的子树、v的子树(包含u、v)。②u是v的祖先这个时候就较为麻烦。首先,一个端点肯定在v的子树中(包含v)。而另一个端点,较为麻烦。令w为u的儿子,且同时为v的祖先。那么这个端点可以取w这棵子...原创 2018-05-17 20:00:08 · 334 阅读 · 0 评论 -
五道线段树题目(树上操作)
基本都要用到dfs序,转为序列操作。(一)codeforces620E New Year Tree子树颜色种类统计,考虑到最多60种颜色,采用位运算或来保存当前颜色状态即可。#include <cstdio>#define N 400010typedef long long ll;struct edge {int to, next;}e[N<<1];int c[N]...原创 2018-05-14 19:02:18 · 467 阅读 · 0 评论 -
TJOI2018 d2t2 异或
n个节点的树,每个点有一个不超过1<<30的权值。有两种查询方式:Q1——给x、y,意为求x的子树(包括x)中,点权与y异或的最大值。 Q2——给x、y、z,意为求x到y这条路径上(包括x与y),点权与z异或的最大值。对于异或最大值问题,考虑使用字典树解决。写了一个非正解的方法,比较愚蠢,线段树套字典树+树链剖分。最早我听说这个方法是...原创 2018-05-14 22:21:17 · 342 阅读 · 0 评论 -
【Hdu4117】GRE Words——AC自动机+dfs序+带区间add线段树维护最大值+dp
GRE WordsTime Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5470 Accepted Submission(s): 680Problem DescriptionRecently George is preparing fo...原创 2018-05-25 19:24:42 · 396 阅读 · 0 评论 -
【NOI2011】阿狸的打字机——AC自动机
除做过一道dfs序维护fail树之外,做这道题还需要想到——将询问离线,用邻接表储存,即每次把所有y相同的处理。From Hzwer:每次查询(x,y),即为查询自动机上path(root->y)的所有结点中,有多少个在x的子树中。树状数组维护区间和。反正这正解我是给跪了。#include <cstdio>#include <cstring>#include &l...原创 2018-05-25 20:38:19 · 295 阅读 · 0 评论 -
*【ZJOI2010】基站选址 线段树优化dp难题
个人觉得这道题很难.......最近我要总结几篇“dp系列”了。令dp[i][j]表示,在第i个位置建造第j个基站时的最小代价。为了方便,我们令n = n + 1,K = K + 1。给最后一个点的c赋0,d和w都赋inf(0x3f3f3f3f,如果用0x7fffffff会爆int),这样的好处是最后一个站一定建造(否则inf就变成答案了,这数字也太大了),且计算进去了前n个的全部的代价。(可以脑...原创 2018-05-26 21:24:25 · 325 阅读 · 0 评论 -
【bzoj1878】统计区间不同种类数
在线做法(只面对kind_num ≤ 60):使用线段树维护,把种类压成一个二进制,每次pushup取或就可以了。离线做法:见代码或他人题解!不会说!#include <cstdio>#include <algorithm>using namespace std;inline char gc() { static char now[1<<16], *S,...原创 2018-05-23 20:26:49 · 620 阅读 · 0 评论 -
[Noi2015]软件包管理器 树链剖分
4196: [Noi2015]软件包管理器Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2411 Solved: 1397[Submit][Status][Discuss]Description Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,...原创 2018-05-24 10:09:57 · 196 阅读 · 0 评论 -
【NOI2010】 超级钢琴 前缀和+主席树+堆
2006: [NOI2010]超级钢琴Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3805 Solved: 1896[Submit][Status][Discuss]Description小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。 这架超级钢琴可以弹奏出n个音符,编号为1至n。...原创 2018-05-24 13:38:54 · 306 阅读 · 0 评论 -
Link-Cut-Tree
What is Link-Cut-Tree?动态树(Link-Cut-Tree),也称LCT,是一种可以维护一个有根树森林改变形态、合并、分离、查询等操作的数据结构。由Robert Tarjan(他可以说是算法大师了,前面的文章中我是提过他的)为首的团队提出。在学习动态树前,要先明白splay的原理。在下面的一段中,会详细介绍splay的rotate与splay两个操作,请大家暂时忘掉有根树森林之...原创 2018-06-07 14:53:34 · 379 阅读 · 0 评论 -
Luogu P3676 小清新数据结构题
Problem一棵有点权树,每个节点都有一个s表示其子树权值和。支持点权修改,以及查询x为根时,所有节点s的平方和。Solution(一)考虑没有换根,即对于所有查询均有x=1 点修改u的权值,设增量为a。根据树的性质,只有path(1, u)上的点的s会被更改。 考虑这次修改对答案的贡献。 ⇒∑i∈path(1,u)(si+a)2−∑i∈path(1,u)s2i⇒∑i∈pa...原创 2018-06-11 09:52:12 · 266 阅读 · 0 评论 -
左偏树
左偏树是一种稳定O(logN)的可并堆算法。 为了做到这个复杂度,我们要保证这么两个事情。以小根堆为例。 1、lson(x)与rson(x)均小于等于x。(just like heap) 2、我们定义一个点的dist(x) = dist(rson(x)) + 1。那么性质就是:必有dist(lson(x)) ≥ dist(rson(x))。(不满足的话我们可以swap,这倒不是问题) ...原创 2018-06-27 21:39:55 · 338 阅读 · 0 评论 -
[BZOJ4771] 七彩树
Problemn个节点的有根数,每个节点拥有一个颜色。边权为1。 现在有m个查询,每个问题有两个整数x和d,表示询问x的字数中depthdepthdepth不超过dep[x]+ddep[x]+ddep[x] + d的所有点中出现来多少种本质不同的颜色。Solution每个点的贡献都是111,那么若有颜色相同的点对(i,j)(i,j)(i,j),那么lca(i,j)lca(i,j)lc...原创 2018-07-23 17:02:32 · 372 阅读 · 0 评论 -
[TJOI2017]不勤劳的图书管理员
Solution1分块+块内树状数组。可以踩掉标算,甚至碾压。#include <cstdio>#include <cstring>#include <cmath>#define rint register int#define N 50010#include <algorithm>typedef long long ll;...原创 2018-07-13 18:03:20 · 351 阅读 · 0 评论 -
「NewCoder1C」保护
Problemnnn个点的树,以1为根,给mmm条路径。 每次询问给vvv、kkk,求一个在满足u-v这条路径至少被kkk条前面给出的路径完全包含的条件下距离根最近的那个点uuu。(输出u−vu−vu-v的距离)Solution由于查询路径只会是直上直下的,所以我们把每条路径拆成两段直上直下的。对于一条路径u−vu−vu-v(dep[u]≤dep[v]dep[u]≤dep[v...原创 2018-09-12 09:08:42 · 295 阅读 · 0 评论 -
bzoj1012
两个操作:加数、查询后几个数的最大值。明显可以用单调队列啊。查询时二分,由于序列单减,故,越接近要查的区间的左点越好#include #include #define ll long long#define M 220000struct node { int p; ll x;}Q[M];int m; ll D;int main() { freopen("1012.in",原创 2017-12-10 14:05:29 · 245 阅读 · 0 评论 -
bzoj1036树链剖分模板题
网上树剖的题解多了去了,所以我就贴一下我的code好了。#include #include #include #define N 30005using namespace std;struct Tree {int l, r, sum, max;}tree[4*N];struct Edge {int to, next;}edge[2*N];int n, cnt = 0, head[原创 2017-12-10 14:22:35 · 269 阅读 · 0 评论 -
不需要旋转,却能力压群雄的数据结构——非旋Treap 看完还不会你打我
非旋Treap讲解Treap,一种平衡树。作为一棵平衡树,一定是遵从着某种原则,使得这棵树尽量的接近完全二叉树。除了二叉搜索树都具备的性质——左子树 ≤ 根 ≤ 右子树,顾名思义,Treap = tree+heap。这时他的特殊性质就飘出水面了——heap。有一个需要慢慢理解的东西,我觉得是本文最重要的——二叉搜索树中顺次排列所参考的参数是灵活的,谁说非要按数值??有的题你就得用下原创 2017-12-16 20:07:13 · 643 阅读 · 0 评论 -
扫描线算法(一)之矩形那些事儿
扫描线算法用一条平行于轴的线扫描几何图形,得出某些所求的解。矩形面积并、交实际上就是线段树维护区间并集的长度。这里思考一下,如果要求被覆盖k次的部分的面积和,怎么办?(留坑)矩形周长并如果你想用简单的两个方向分别扫,当然可以了。这里提供一个只扫一次的方法。(为了炫个技锻炼思维水平)node:l、r表示左右端点 lp、rp表示端点有没有被覆盖 cnt表示被...原创 2018-05-09 21:29:44 · 984 阅读 · 0 评论 -
[Usaco2016 Feb] Load Balancing
平面上有N个点。现在要划两条分别平行于x轴y轴的直线,使得四个部分的点数的最大值趋于最小。O(N²logN)解法请点击:lookas2001这里有一个加强版——N≤1e5,我们就要用更高效的算法去解决。首先依旧把所有坐标离散。我们枚举一条分割线,至多枚举N次。(比如说枚举每一条horizontal line)那么就把这个平面分成上下两部分。上面n1个,下面n2个。(n1 + n2 = n)一条ve...原创 2018-05-09 21:05:03 · 360 阅读 · 0 评论 -
平衡树及其可持久化
可能是以前受一个指针版本treap的影响,一直是以pair格式去写treap的。 原来引用&amp;这么方便啊。 这篇文章的代码,都是我找到的一些十分优雅的写法。void split(int i,int x,int &amp;a,int &amp;b){ if(!i) a=0,b=0; else { if(w[i]&lt;=x) a=i,split(t...原创 2018-05-06 12:38:46 · 905 阅读 · 0 评论 -
洛谷P4175 [CTSC2008]网络管理Network
题目描述M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络。该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信...原创 2018-05-03 13:37:11 · 197 阅读 · 0 评论 -
TJOI2018 prepare
明天就是TJOI2018了,期待已久。下午三点时候我告诉自己,做完TJOI2017不勤劳的图书管理员,就休息了。然后我就写+改到了现在。先说题解吧。分块处理的,我也不会树套树,总之就是各种暴力。每一个整块都可以lower_bound+排序前缀和,直接求出贡献。零碎的部分枚举就可以,复杂度应该也是没问题的,并不是卡常或者数据弱。#include <cstdio>#include <...原创 2018-04-28 19:58:58 · 534 阅读 · 1 评论 -
三维偏序问题
一维偏序——排序。二维偏序——排序+BIT。三维偏序:考虑分治。对于l到r这段区间,如果想求解对于每一个i∈[l, r],有多少个j∈[l, r]且i≠j满足i的三个维度全部大于等于j的。那么我们可以考虑,整段按照x排序,这样右边的就必定不会对左边产生贡献。分治l~mid与mid+1~r这两段,然后再把左边对右边的贡献加上即为这一段的答案。于是,第一维此时就没有用了,只看y与z。参照归并排序思想,...原创 2018-04-25 22:19:33 · 2231 阅读 · 0 评论 -
bzoj5301 [莫队]
5301: [Cqoi2018]异或序列Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 117 Solved: 88[Submit][Status][Discuss]Description已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l、r ,问在 [l,r] 区间内,有多少连续子序列满足异或和等于 k 。也就是...原创 2018-04-20 11:50:02 · 193 阅读 · 0 评论 -
bzoj4399 魔法少女LJJ
这题不愧为4399。4399: 魔法少女LJJTime Limit: 20 Sec Memory Limit: 162 MBSubmit: 622 Solved: 145[Submit][Status][Discuss]Description在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气...原创 2018-04-18 15:21:21 · 421 阅读 · 1 评论 -
bzoj4373
给一个允许点修改的序列,询问l到r这段是否构成公差为k的等差数列。构成公差为k等差数列的充要条件:①最大值-最小值 = k * (r - l)②差分后的gcd是k的倍数(需要特判k==0)③这段里没有重复的数前两个可以用线段树维护。最后一个需要开一个pre数组,pre[i]表示1~i-1这段中最靠右的、且与i的值相同的位置。(set维护一下动态修改前后的量)找这段里pre最大的,如果小于l,即为正...原创 2018-04-18 09:34:07 · 235 阅读 · 0 评论 -
NOI2017 整数
压位线段树做法挺泛滥的,mark一个在网上看到的神奇做法吧。首先a有正负,所以相当于有加有减。就可以把加数加在一起,减数加到一起。每次查询就把当前的这两个高精度二进制s1与s2(stl术语叫bitset?)相减,就是答案。至于怎么加呢?给出的方案是:把a拆成若干二进制的和,给那一位加1,然后暴力进位。因为你想,最惨的情况就是一串1,这样的话就很讨厌。但是,在进位之后又都变成0了。所以复杂度是均摊的...原创 2018-04-12 21:51:02 · 850 阅读 · 0 评论 -
ural1019 找最长全白线段
【题目描述】 先是在数轴区间 0 到10^9 (10的9次方)之间画上了白色。然后,这个区间的某一些部分又画上了黑色。然后某一些部分又画上白色,等等。请你找出经历M(1 <= M <= 5000)次重着色后,最长的白色区间。【输入格式】 首行位N,以下N行位重着色的信息,每一行格式如下:ai bi ci 这里 ai ,bi 都是整数, ci 为字符'b' 或...原创 2018-03-28 22:35:19 · 538 阅读 · 0 评论 -
Codeforces 703D
Problem对于一个由N个数组成的序列,有M次询问。每次问a[l ~ r]这个区间里,出现次数为偶数的数的异或和(没出现的数不算)。Solution由于是静态的区间处理,首先想到莫队。但是1e6的数据量,显然N*sqrt(N)就已经1e9了。然后我和队友展开了激烈的讨论。我这种位运算的蒟蒻,显然没想到这个性质。感谢我机智强大的队友。于是我就被启发了!!如图。最后我的思路卡在了如何弄偶数。emmm...原创 2018-03-25 15:12:09 · 339 阅读 · 0 评论 -
对顶栈的深入理解
由于hdu4699,感受到了对顶栈的厉害所在。于是,以后遇到,有光标,一次只移动一位,且添加、删除均是点操作且位置一定在光标左右时,都考虑对顶栈解决。也不知道为什么这个题不能加读入优化。是我太弱了。#include <cstdio>#include <cstring>int n, f[1000010], sta1[1000010], sta2[1000010], p1,...原创 2018-03-11 12:59:47 · 969 阅读 · 0 评论 -
NOIP2017 d2t3 phalanx 树堆解法
Solution方面就不多说了。直接上代码:My code.原创 2018-02-20 17:37:05 · 324 阅读 · 0 评论 -
poj3784——动态维护中位数(二)
来填坑了。其实离线做法十分简单。全部读取进来,给这个序列进行排序。毫无疑问中位数在最中间啊。然后倒序(输入的顺序),如果N为奇数,给出答案,然后弹出这个数字(说是弹出,其实就更改一下中位数的指针即可,因为中位数指针只能相邻的移动)。这样一来,再正序输出,就万事大吉了。...原创 2018-02-10 21:16:10 · 543 阅读 · 0 评论 -
poj3784——动态维护中位数(一)
Problem读入一个整数序列,每次读入一个,若进队后元素数量为奇数,请输出中位数。(不难看出你要输出好多次)Solution所谓动态维护就是这么个意思。提供一个在线做法:对顶堆。建俩堆,一个小根堆一个大根堆。假设序列长度为N,始终保证升序的1~N/2在大根堆中(顶端肯定是a[N/2]),而N/2+1~N这些在小根堆(顶端是a[N/2+1])。进来一个数之后先判断是进大根堆还是进小根堆,进完之后,...原创 2018-02-09 21:19:48 · 361 阅读 · 0 评论 -
[Apio2012] Guard
Solution有一些个位置一定是不能存在忍者的。于是我们把这些位置拿走,给所有的数据重标号。 做法:开一个长度为 nnn 的数组,对于一定是 000 的一段我们全赋为 111 。最终我们把为 111 的扔掉即可。可以用差分///线段树维护。若重标号后, n=kn=kn=k,那么所有草丛都必须有忍者。特判掉。 而若一个区间 AAA 完全包含另一个 BBB ( AAA 是大的 ),那么...原创 2018-09-10 15:33:33 · 306 阅读 · 0 评论