
数据结构
文章平均质量分 71
sharp_legendgod
这个作者很懒,什么都没留下…
展开
-
浅谈AC自动机
浅谈AC自动机建议学过 AC 自动机的人来看。注意我们一开始直接建立串的时候是 Trie\tt TrieTrie 图,之后建立 fail\tt failfail 指针的时候才是真正的 ACACAC 自动机。具体来说对于 Trie\tt TrieTrie 上深度从小到大的一条链,对应的是一个曾经在某个或者多个串中出现过的子串。如果说是一条从根到底的链那本质就是代表一个串,显然对于一条链之间的点,本质上深度小的是深度大的前缀串。用处:我们可以通过遍历 Trie\tt TrieTrie 图来不重原创 2021-11-06 20:06:01 · 435 阅读 · 0 评论 -
Kruscal 重构树浅谈
Kruscal 重构树浅谈这个算法本质上就是通过 Kruscal\tt KruscalKruscal 重构树的过程将边权变成点权之后建立一个堆。具体来说就是每次选择一条合法的边,将边权变成点权之后连接原来边两边的节点。这个是生成树上的性质,有些大佬说可以类比成笛卡尔树,不过那个是序列上的满足堆和 Bst\tt BstBst 的性质的树。可能性质还笛卡尔树更多一点。常用解法跳父亲找到符合条件的最小点。维护 dfs\tt dfsdfs 序判断点是否在内。结合动态规划和数据结构维护书上信原创 2021-10-09 19:56:52 · 166 阅读 · 0 评论 -
[NOI2018] 归程 题解
[NOI2018] 归程[NOI2018] 归程讲一下科技 Kruscal\tt KruscalKruscal 重构树的做法。考虑到积水的问题,我们肯定是贪心选择积水深度最大的边进行建立重构树。那么这个就是一个小根堆。之后考虑我们如何回答询问,对于一个询问的水深度,跳父亲。同时维护一下每个点的子树距离 111 节点距离最小的点即可。对于 Kruscal\tt KruscalKruscal 重构树,每次根据 Kruscal\tt KruscalKruscal 的过程选出边,但是将边权变成点权之原创 2021-10-09 19:47:11 · 150 阅读 · 0 评论 -
[IOI2018] werewolf 狼人 题解
[IOI2018] werewolf 狼人[IOI2018] werewolf 狼人可以考虑到每一条边能否通过对于人形态来说,取决于两点的最小值,对于狼形态来说取决两点的最大值。那么我们不妨考虑将两条边的边权定为上述两者,这样就有两张联通的无向图,我们考虑既然不考虑路程的限制我们一个肯定是需要考虑最大生成树另外一个就是最小生成树。使用 Kruscal\tt KruscalKruscal 重构树建立两棵树,一个是大根堆另一个是小根堆。对于两个 x,yx, yx,y 能否到达取决于是否存在一个点同原创 2021-10-09 19:38:31 · 319 阅读 · 0 评论 -
P4719 【模板】“动态 DP“&动态树分治 题解
P4719 【模板】"动态 DP"&动态树分治P4719 【模板】“动态 DP”&动态树分治先不考虑修改,可以想到 Dp\tt DpDp:设 f(i,0/1)f(i, 0/1)f(i,0/1) 表示当前的点是否选择,那么转移可以得到:f(u,0)=∑v∈sonumax(f(v,0),f(v,1))f(u,1)=∑v∈sonuf(v,0)\begin{aligned}f(u, 0) &= \sum_{v \in son_u} \max(f(v, 0), f(v, 1)原创 2021-10-08 16:26:05 · 209 阅读 · 0 评论 -
[PKUWC2018]Minimax 题解
P5298 [PKUWC2018]Minimax2021.10.82021.10.82021.10.8 重新自己写出这题。其实不要想太复杂就好了,别忘了看题面。先给一个提示吧,为什么这题的 DpDpDp 不用融斥掉中间的部分,题目已经说出来了:没有重复权值的叶子。首先考虑对于每一个节点的值最多只有 n 个,所以肯定需要离散化。之后考虑实际上每一个节点的值都是从其子树的叶子节点中转移过来的。所以考虑树形 Dp设 f[i][j]f[i][j]f[i][j] 表示在树上点 iii 其值原创 2021-10-08 09:10:48 · 253 阅读 · 0 评论 -
全局平衡二叉树 P4751 【模板】“动态DP“
全局平衡二叉树 P4751 【模板】"动态DP"P4751 【模板】“动态DP”&动态树分治(加强版)有事没事就用 vector\tt vectorvector 总会有天废掉的。注意在 c++11\tt c++11c++11 之后 vector\tt vectorvector 不管是是否在 O2O2O2 的条件下,速度都比常规数组慢很多,甚至比链表要慢 444 倍。死亡写法:struct Tree : vector<vector<int>> {原创 2021-10-01 21:29:11 · 215 阅读 · 0 评论 -
LOJ #2269. 「SDOI2017」切树游戏 题解
LOJ #2269. 「SDOI2017」切树游戏#2269. 「SDOI2017」切树游戏没错我在某谷被卡掉了,之后会了全局平衡二叉树再更新那个做法。不考虑修改怎么做。设 f(i,j)f(i, j)f(i,j) 表示以 iii 为根的子树(必须包含点 iii)异或值为 jjj 的方案数, G(i,j)G(i, j)G(i,j) 以 iii 为根的子树的答案。考虑更新。对于上一个答案 f′(i,j)f'(i, j)f′(i,j) 当前儿子 vvv 可以更新得到:f(i,j)=∑j=k⊗x原创 2021-09-28 18:33:30 · 357 阅读 · 0 评论 -
SP1716 GSS3 - Can you answer these queries III 题解
SP1716 GSS3 - Can you answer these queries IIISP1716 GSS3 - Can you answer these queries也真是服了,浪费几分钟来搞这种题目。直接线段树维护一下端点信息即可,具体来说就是左右端点的权值最大值,答案还有区间权值和。#include <bits/stdc++.h>using namespace std;//#define Fread//#define Getmod#ifdef Fread原创 2021-09-26 15:18:13 · 173 阅读 · 0 评论 -
CF718C Sasha and Array 题解
CF718C Sasha and ArrayCF718C Sasha and Array重点:矩阵乘法 a×(b+c)=ab+aca\times(b + c) = ab + aca×(b+c)=ab+ac。而且矩阵乘法是有结合律的:a×b×c=a×(b×c)a \times b \times c = a\times (b\times c)a×b×c=a×(b×c)但是 没有\color{red}\text{没有}没有 交换律!!发现这个下标的信息不是很好维护我们考虑将其放到矩阵里面进行维原创 2021-09-23 10:27:58 · 210 阅读 · 0 评论 -
一句话解释哈夫曼树
一句话解释哈夫曼树 我们考虑对于一棵叶子节点有权值的二叉树,设其总共的贡献是每个叶子节点的权值乘上深度。那么我们需要构造一个使其贡献最小的二叉树,也就被称作最优二叉树。我们考虑贪心对于每次选择权值和最小的两个点进行合并,之后其父亲,权值为两个节点的权值和即可。...原创 2021-09-16 15:30:34 · 75 阅读 · 0 评论 -
Codechef Dynamic GCD 题解
Codechef Dynamic GCD Codechef Dynamic GCD就是考虑维护链上 gcd\gcdgcd 和链加。我们先考虑这个东西放到序列上怎么做,首先进行差分,之后因为 gcd\gcdgcd 是不变的,但是区间加可以直接变成了单点修改用线段树进行维护即可。对于树上的情况,我们直接使用树链剖分进行分成若干条链进行计算。具体来说我们考虑对于一条链 u,v,fau=vu, v, fa_u = vu,v,fau=v,我们让节点 uuu 的值变成 av−aua_v - a_..原创 2021-09-15 19:21:33 · 266 阅读 · 0 评论 -
CF150E Freezing with Style 题解
CF150E Freezing with Style经典的更优复杂度不会,大众分都懂。就是对于中位数的话进行树上路径合并很难处理,那么我们不妨二分中位数,之后将 ≥\ge≥ 的数作为 111,否则就是 −1-1−1。那么合法的一条路径肯定是权值和 ≥0\ge 0≥0。前面取等号是题目的要求。那么对于一条路径如果其长度是 len\tt lenlen 那么我们合法的配对路径的取值范围就是 [L−len,R−len]\tt[L - len, R - len][L−len,R−len]。因为要使其原创 2021-09-03 11:02:47 · 185 阅读 · 0 评论 -
CF855G Harry Vs Voldemort 题解
CF855G Harry Vs Voldemort根据 hater\tt\color{black}{h}\color{red} aterhater 的话,这个东西放到现在有 280028002800。显然恶评。就是对于一个 333 元组,我们发现本质就是树上两条路径合并的问题,那么我们像淀粉质一样将每个点作为 Lca\tt LcaLca 计算答案即可。那么一开始的答案就是 ansu=(n−1)×(n−1)−∑v∈sonusizv×sizv−(n−sizu)×(n−sizu)ans_u = (n原创 2021-09-02 21:45:26 · 207 阅读 · 0 评论 -
CF1299D Around the World 题解
CF1299D Around the World就是是否能有为 000 的路径直接会想到线性基,也就是里面的环是可以走或者不走的。我们写一手暴力发现大小为 555 的线性基的个数不会很多,那么我们可以考虑对于每个联通块存一个线性基。如果说联通块内部已经有环线性相关那么肯定是不能连边的。如果线性无关那么考虑题目给出的性质,也就是和 111 相连的环大小最多为 333。那么我们对于一个联通块最多有 222 个点和 111 相连。我们进行分类讨论有 222 条边相连的情况。断掉两条边也就是直接加入即可原创 2021-09-02 09:43:08 · 134 阅读 · 0 评论 -
CF757G Can Bash Save the Day? 题解
CF757G Can Bash Save the Day?时间复杂度分析好题(大雾)。将询问拆成几部分,也就是 dis(u,v)=dep(u)+dep(v)−2∗dep(Lca(u,v))dis(u, v) = dep(u) + dep(v) - 2 * dep(Lca(u, v))dis(u,v)=dep(u)+dep(v)−2∗dep(Lca(u,v))。显然对于 LcaLcaLca 我们直接进行树链剖分即可。我们对于每一个 vvv 维护 ≤l\le l≤l 的 dep(Lca)dep(Lc原创 2021-08-31 15:47:15 · 174 阅读 · 0 评论 -
CF1523H 题解
CF1523H首先这个东西很像一个 dpdpdp。我们不妨将删点记录成一个状态,然后发现状态数量太多了,我们可以倍增优化一下状态数量。设 f(i,j,k)f(i, j, k)f(i,j,k) 表示从点 kkk 开始删除了 jjj 个点,走 2i2^i2i 个点能到达的最优的点。我们考虑最简单的情况,就是从 iii 开始走 jjj 步能走到的最优的点。答案是 x+axx +a_xx+ax 最大的点,因为对于一个 y>x,ay+y<ax+xy > x, a_y + y < a_x原创 2021-08-31 08:40:46 · 121 阅读 · 0 评论 -
LOJ「HEOI2015」最短不公共子串 题解
「HEOI2015」最短不公共子串题目大意:给两个小写字母串 A,BA, BA,B 请你计算:AAA 的一个最短的子串,它不是 BBB 的子串。AAA 的一个最短的子串,它不是 BBB 的子序列。AAA 的一个最短的子序列,它不是 BBB 的子串。AAA 的一个最短的子序列,它不是 BBB 的子序列。简单题。看了一下网上的题解有用 dpdpdp 的。但是既然是最小长度可以考虑使用广度优先搜索。首先这个可以保证找到的第一个就是最优解。其次因为我们两个自动机都是按照深度向下排序的,那么本质原创 2021-08-26 09:22:24 · 261 阅读 · 0 评论 -
CF375D Tree and Querie 题解
CF375D Tree and Queries线段树合并。需要记录两颗线段树,其中一棵表示当前节点的颜色数量,另外一个表示出现次数为 iii 的颜色个数。前面一棵直接进行线段树合并即可。后面的那棵能线段树合并的条件当且仅当有一种颜色只在一个子树中出现,我们可以直接对于这种情况进行合并。不然我们需要修改颜色,也就是暴力修改。暴力修改的次数最多是 O(n)O(n)O(n) 次。复杂度正确。Tricks:Tricks:Tricks:我们先将可以进行合并的节点进行合并,之后再暴力修改。具体来说就是先统计原创 2021-08-24 15:34:40 · 145 阅读 · 0 评论 -
luogu P2664 树上游戏 题解
luogu P2664 树上游戏\tt luogu\ P2664 \ 树上游戏luogu P2664 树上游戏题目大意:一棵树上每个节点都有颜色,给定一个长度为 nnn 的颜色序列,定义 s(i,j)s(i, j)s(i,j) 为 i→ji \to ji→j 的颜色数量。设 sumi=∑j=1ns(i,j)sum_i = \sum_{j = 1} ^ n s(i, j)sumi=∑j=1ns(i,j)。求所有的 sumisum_isumi。这个本质可以原创 2021-08-24 14:03:43 · 309 阅读 · 0 评论 -
CF587F Duff is Mad 题解
CF587F Duff is Mad暴力就是每个串都在自动机上跑一下。稍微优化一下就是之前跑过的就不跑了。在跑的时候把所有的答案都记录下来。之后考虑进行根号分治。如果说当前串的长度 >n> \sqrt n>n 那么出现次数肯定 <n< \sqrt n<n。我们直接进行暴力跑,是可以接受的。对于长度 <n< \sqrt n<n 的串,我们考虑建立 failfailfail 树。之后从根节点开始遍历,对于每一个结束标记都放到主席树里面去原创 2021-08-23 21:21:03 · 219 阅读 · 0 评论