随笔分类 - 树
摘要:圆方树模板题. 建出圆方树. 对于每个方点,只维护方点儿子的最小值,不维护方点父亲的值,这样的话每次修改只会改一个方点. 我们需要支持单点修改,链查询,求 lca. LCT 可以非常方便地维护这些东西,然后如果 lca 是方点的话特判一下方点父亲的点值即可,可以单独开一个命名空间以防止变量名冲突。
阅读全文
摘要:这个题求完斯坦纳树后再搞一个类似于子集 DP 就行了. 我写的好像有点麻烦,但本质是相同的. code: #include <bits/stdc++.h> #define N 3006 #define M 13 #define inf 0x3f3f3f3f #define ll long long
阅读全文
摘要:这个其实就是状压DP+spfa. 本题需要输出方案,有一点点麻烦 code: #include <bits/stdc++.h> #define ll long long #define N 12 #define inf 0x3f3f3f3f #define setIO(s) freopen(s".i
阅读全文
摘要:大大大数据结构题. 我们发现,如果 $k=2$,答案就是树的直径. 而 $k>2$ 时,相当于选择 $k$ 个叶子,使得这些叶子的并最大. 我们有一个显然的贪心:$k+1$ 的答案一定是在 $k$ 的答案上加一个叶子. 如果不考虑修改,这其实就是长链剖分. 即 $k$ 时的答案就是大小为前 $k$
阅读全文
摘要:思路自然的码农题. 显然分类讨论一下编号在 $[l,r]$ 的点与 $p$ 的子树关系. 如果都在 $p$ 的子树内就是个区间 $lca$. 否则,就二分第一个满足 $p$ 的祖先且子树内部没有 $[l,r]$ 之间的点. 二分验证的话要用主席树. code: #include <cstring>
阅读全文
摘要:A - Sasha and a Bit of Relax code: #include <cstdio> #include <map> #include <cstring> #include <algorithm> #define N 300006 #define ll long long #def
阅读全文
摘要:这道题很巧妙啊. 有两个性质: 1.一个图的最小生成树的每种边权数量是相等的. 2.有 1 得,如果任意一个最小生成树中边权为 $v$ 的边都断掉,$(x,y)$ 连通性在任意 MST 中都相等. 所以我们的做法就是先求出最小生成树,然后分别将每种边权 $v_{i}$ 从最小生成树中都断掉,得到若干
阅读全文
摘要:矩阵树定理求的是 $\sum_{E} \prod_{e \in E} w(e)$ 平时我们求的大多数是方案数,所以就默认那个 $w(e)$ 是 $1$. 而如果我们想求所有生成树权值之和的话就让那个 $w(e)$ 变成边权. 我们在设置最开始的那个 (度数-邻接)矩阵的时候度数矩阵中 $S1_{i,
阅读全文
摘要:求生成树方案的话要用矩阵树定理,然后这个容斥就是常见套路了吧. code: #include <cstring> #include <cstdio> #include <vector> #include <algorithm> #define N 18 #define mod 1000000007
阅读全文
摘要:code: #include <cstring> #include <cstdio> #include <algorithm> #define N 303 #define mod 1000000007 #define ll long long #define setIO(s) freopen(s".
阅读全文
摘要:这里的模数不是质数,所以需要用类似辗转相除的方式进行高斯消元. code: #include <cstdio> #include <algorithm> #define N 100 #define ll long long #define mod 1000000000 #define setIO(s
阅读全文
摘要:这里简单讲一下矩阵树定理: 我们分 3 种情况: 1. 给定一个无向图,求生成树个数. 2. 给定一个有向图,求以一个点为根的内向树个数. 3. 给定一个有向图,求以一个点为根的外向树个数. case1: 构造度数矩阵 $S1$,满足 $S1_{i,i}$ 等于 $i$ 点的度数(一条无向边当成两条
阅读全文
摘要:好神仙的多项式啊! 需要用到:prufer序列,生成函数,多项式求逆,多项式取 ln,多项式 exp..... code: #include <cmath> #include <cstring> #include <algorithm> #include <cstdio> #include <str
阅读全文
摘要:直接套用 prufer 序列公式即可,但是要特判不合法的情况. code: #include <cstdio> #include <algorithm> #define ll long long #define N 200 #define setIO(s) freopen(s".in","r",st
阅读全文
摘要:根据prufer序列的结论: 一个无根树对应唯一一个 prufer 序列,一个 prufer 序列也唯一对应一个无根树. 一个点在 prufer 序列中的出现次数是 $deg_{i}$ 次. $n$ 个点完全图的生成树个数是 $n^{(n-2)}$ 个. code: #include <cstdio
阅读全文
摘要:这道题在家里仔细想想还是挺好想的... 考场的时候还是要镇定,给每道题要安排足够的思考时间. code: #include <cstdio> #include <cstring> #include <vector> #include <string> #include <algorithm> #de
阅读全文
摘要:换根DP 求一下每个点为起点的最长路径,然后用双指针扫一下统计答案就好了. code: #include <cstdio> #include <queue> #include <set> #include <algorithm> #define N 1000007 #define ll long l
阅读全文
摘要:这个思路还是非常巧妙的. 困难在于我们需要同时维护以 $x$ 为分治中心,延伸出颜色相同/不同的最大值. 不同的话直接将权和相加,相同的话还需要减掉重复部分,这就比较难办. 但是我们发现,当以 $x$ 为分治中心时,$x$ 每一个儿子为根的子树的延伸颜色都是相同的. 所以我们可以将每一个点的所有儿子
阅读全文
摘要:题意:给定一棵树,每次钦定一个点为根,求以这个点为根时每个点子树权和平方之和,有单点修改. 虽然有修改,但是没有换根操作(等于说每次询问时只换依次根) 我们初始的时候不妨令 $1$ 为根,并考虑当根为 $x$ 时与根为 $1$ 时的差别. 我们发现,当根为 $x$ 时,子树权和发生改变的只是 $1$
阅读全文
摘要:维护 $\sum_{}v[i]\times dep[i]$ 与 $\sum_{} v[i]\times dep[i]^2$ 其中 $dep[i]$ 表示 $i$ 点在该点所在 $LCT$ 的 $splay$ 中的中序遍历序. 然后正着维护一个,反着维护一个就行了. #include <cstdio>
阅读全文