随笔分类 - 数据结构
摘要:gate 发现这道题以前没写题解…… 首先可以看出是并查集。 物种间有同类、吃、被吃三种关系。 除了要记录物种,还要记录种间关系。 这时就要用到种类并查集。这是一种带权并查集,其中每个节点要记录它与父节点的关系,这个关系在经过路径压缩后是不变的。 设这个权值为d,则有 \(d[x]-d[y]=0
阅读全文
摘要:gate 有向图求最短路,需要进行三种操作: 点向点连边 点向区间连边 区间向点连边 用线段树优化建图可以解决。 建立两棵线段树,一棵存入边,一棵存出边 入边: 出边: 所以线段树看起来应该是这样子的: 线段树内的边权为0。 code #include<cstdio> #include<iost
阅读全文
摘要:gate 有pi的概率取最大,1−pi的概率取最小。 首先把权值离散化 每个节点开一棵线段树,记录每个权值被取到的概率。 对于线段树i,设两个子树为ls,rs,取到值j的概率f[i][j] \(f[i][j] = \\ f[ls][j]*(\sum\limits_{k=1
阅读全文
摘要:gate 线段树合并 设两个要合并的线段树为a,b, 若a或b不存在,则返回另一个。 否则,将b的数值累加到a上,并返回a。 代码如下 int merge(int a,int b,int l,int r) { if(!a) return b; if(!b) retur
阅读全文
摘要:gate 用时:40min(看题解了) 线段树,然而思路不太好想,考虑看题解 每个公路有一个拥堵值a[i],如果当前时间能被a[i]整除,那么通过这条公路需要2分钟,否则需要1分钟,2≤a[i]≤6 由于a[i]的范围很小,lcm(a[i])的最大值只有$
阅读全文
摘要:gate 用时:看题解一上午,写代码120min 省选打完了,继续停课... gg说要做历年省选题,还要看博客...公开处刑... 每个modify操作会复制1倍线段树并修改。 然而实际上不需要维护那么多线段树,维护1棵并在树上dp即可。 对于不同状态的节点有不同的维护操作,需要分类讨论。 (L
阅读全文
摘要:gate 这是一道虚树的模板题。首先来介绍一下什么是虚树。 虚树,顾名思义,是一棵原本不存在的树。 虚树DP的标志是:一棵n个点的树,给出k个关键点(∑k<n2),求使这些点互不连通的最小代价。 可以发现,答案只与这些点和他们的LCA有关。 所以,可以通
阅读全文
摘要:"gate" 还算好想的一个树链剖分+线段树... 修改一段路径的颜色直接区间修改即可。 询问颜色段数量时,线段树的每个节点记录这一段有多少个颜色段。 pushup和query时要检查mid和mid+1是否颜色相同, 例如 递归路径时要检查top[x]和fa[top[x]](两条路径的交界处)是否颜
阅读全文
摘要:gate 当一个数列满足,但它的1,2项不是1,1时, 称它为类斐波那契数列。 它满足以下性质: 若有: 1.设,则 2. 证明: 设,则 3.前缀和公式: 证明: 通过以上性质,发现它可以用线段树维护。 对于每个节点,sum表示区间和; c1,c2表示这段区间被加上了前两项分别为$c1
阅读全文
摘要:gate 我回来了... 本来是应该12月发的blog,没想到拖到了现在,注意事项什么的稍微有点忘了,以后再慢慢补充吧 点分治是一种树上算法。顾名思义,就是对每个点进行分治,计算它的子树对答案的贡献。 主要用于处理树上路径,且一个点会被统计多次的问题。 以这道题为例: 询问树上距离为k的点对是否存在
阅读全文
摘要:gate 二维树状数组,区间修改,区间查询 对于区间(x,y),用差分数组来维护,每次从(1,1)加到(i,j) 可以发现,t[1][1]被加了x∗y次,t[1][2]被加了(x−1)∗y次… 那么区间(x,y)的和即为 ∑i=(1,x)∑j=(1,y) $t[i
阅读全文
摘要:gate 并查集! 对于一段区间(L,R),若有奇数个一,则(1,L-1)和(1,R)奇偶性一定不同,反之亦然。 把奇偶性相同的区间连起来。 如果将i和i+N视为相反的状态, 假设A和B的奇偶性相同,则合并A,B,A+N,B+N。 不同,则合并A.B+N,A+N,B。 那么,每次给出一个回答,合并前
阅读全文
摘要:gate 区间修改,单点查询 用差分维护。 因为查询返回了(1,x)的和,所以查询的时候直接查x就可以了。 至于修改,就要在区间开始加上,结尾减去,即(x,k),(y,-k) 代码如下 #include<cstdio> #include<iostream> #include<cmath> #incl
阅读全文
摘要:gate 二维树状数组板子?qwq 注意下标不要从0开始 代码如下 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #define MogeKo qwq using namespace std; #defin
阅读全文
摘要:传送门 作为给dtx的妹子讲题的交换他给我讲的 果然线段树最可爱了w 扫描线可以用来求矩形的面积并… 一个平面上有一些有重叠的矩形,求他们的并集的面积。 直接放网上的图了x 对于每个矩形,将y坐标拆成两个修改操作(插入和删除),从下到上排序; 将x坐标unique离散化,从左到右排序,用线段树维护切
阅读全文
摘要:传送门(已毁) 老板的题qaq 题目描述 n 个星球,有 m 条星球与星球之间的双向航道。(莫得航道的两个星球不可互相到达) 可以进行如下操作: 生成 Ti 个生物到一个星球 Xi,并给定这些生物的智商程度 Yi 破坏一条航道,航道编号为 Si 询问给定的一个星球 Xi ,从 Xi 出发
阅读全文
摘要:传送门 这是一个莫队板子qwq 莫队是一种离线暴力算法,每次通过调整当前询问和上次询问的区间的不同的左右端点,并修改答案。 可以看出,调整的越少跑得越快,所以每次先把询问的左右端点排个序,按左端点分块,块相同的按右端点排序 (玄学) 代码如下 #include<cstdio> #include<io
阅读全文
摘要:传送门 给出一个1到n的全排列,求经过m次局部升/降序排序后,第q位上的数字。(n.m≤1e5) 正解是:二分答案+线段树 (????WTF) 因为n很小,所以可以用二分答案枚举第q位上的数字。 把比二分的这个数mid小的数字全部改为0,其他的改为1,然后对01序列进行计数排序——即统计1的个数,然
阅读全文
摘要:传送门~ 树链剖分,顾名思义,就是把树分成链。 通过这个方法,可以优化对树上两点间路径、某一点子树的修改和查询的操作,等。 流程 dfs1() 在这个函数中,要处理出每个节点的: 深度dep[] 父亲fa[] 大小siz[] 重儿子编号hson[] 一个节点的siz[],是包括它自己、它的儿子、
阅读全文
摘要:传送门 我居然把swap写成了switch 如果路径相交,那么一定有LCA(a,b)在路径c,d上,或LCA(c,d)在路径a,b上 如果x在路径a,b上,需要满足条件: dpth[x] >= dpth[LCA(a,b)] LCA(a,x)=x 或 LCA(b,x)=x 就这样,求出LCA后分别判断
阅读全文