随笔分类 - 树
摘要:考场的时候智障了,写了 6k+ 的树链剖分. 如果题目带修改的话可以用树链剖分来维护,但由于没有修改用一个前缀和其实就够了. 求 $\sum_{i=l}^{r} f(a,i)$ 可以写成两个前缀相减的形式. 然后我们就要求 $\sum_{i=0}^{r} f(a,i)$. 求这个的话用倍增讨论 $a
阅读全文
摘要:比较好的一道数据结构题. 对于 $i$,我们希望求出所有经过 $i$ 号点的路径所构成的树链之并. 考虑一个求解树链的并的经典做法就是 $\sum_{i=1}^{n} dep[i]-\sum_{i=2}^{n} dep[LCA(i,i-1)]$. 这里要求所有点都要按照 $dfs$ 序排好. 那么这
阅读全文
摘要:本来以为这道题会非常难调,但是没想到调了不到 5 分钟就 A 了. 由于基于多项式的运算都可以方便地进行封装,所以细节就不是很多(或者说几乎没有细节) 题意:给定一棵树,每个点有点权,求对于所有大小为 $m$ 的独立集的点权之积的和. 数据范围:$n,m \leqslant 8 \times 10^
阅读全文
摘要:先对完全图构建矩阵,然后将原树上的边 $(x,y)$ 在矩阵中的边权标记成 $x^1$,其余边权为 $1$. 矩阵树定理求的是所有生成树边权乘积之和,那么要是可以对含 $x$ 的矩阵求行列式的话可以直接得出答案. 但是复杂度太高,而且难写(写不了) 所以用 $n$ 个不同的整数来替换那个 $x^1$
阅读全文
摘要:这道题里需要用到指针. 这里讲一下指针的一些基本操作: 首先,我们要分配一些内存,然后分配一个指针来指向这个内存: int pp[N],*p=pp,*f[N]; 这里指针的空间都会被分配到 pp 里. 假如说我们想给 $f[x]$ 分配一些内存,我们就令 $f[x]=p$,$p \leftarrow
阅读全文
摘要:如果只要求判断有没有解的话很好做:以条树边被两条非树边覆盖即可. 输出方案的话可以考虑碰到一条非树边就暴力覆盖. 如果覆盖的过程中发现一条边已经被覆盖了就输出结果. 由于一条边只能被一种非树边覆盖,所以复杂度均摊下来是 $O(n)$ 的. 然后我们就得到两条路径 $(a,b)$ 与 $(c,d)$,
阅读全文
摘要:这道题卡常啊 ! 出题人说 $O(n \log^2 n)$ 可过,但我写了个 $O(n \log^2 n)$ 的树剖卡了半天常数. 最暴力的做法:枚举区间,然后跑一个树形DP 来求最小匹配. 显然,因为要求匹配值最小,所以一定是能匹配就先匹配. 也就是说递归完 $x$ 的所有儿子后,$x$ 的每一个
阅读全文
摘要:这道题有 3 个操作: 1. 换根 2. 求 LCA 3. 子树修改/子树求和. 对于第一个操作,直接换根就行. 对于第二个操作,分这几种情况讨论:$x,y$ 都在以 1 为根,$rt$ 的子树中,$x,y$ 其中 1 个在子树中,$x,y$ 都不在子树中. 对于都在子树中的情况,答案即为 $lca
阅读全文
摘要:非常好的一道题. 假设当前要求 $ans[x]$. 先令 $x$ 为根,然后发现对于子树 $y$ 来说,令 $g[y]$ 表示距离 $y$ 最近的叶子节点. 若 $g[y] \leqslant dis(x,y) $ 则 $y$ 子树的叶子中选一个就可以防止 $x$ 走到 $y$ 的子树中. 那么这个
阅读全文
摘要:比较好的一道虚树题. 建出虚树,然后计算虚树中距离点 $x$ 最近的关键点,这个来一次树形dp+换根即可实现. 难点在于计算 $x$ 到 $x$ 父亲这一段所有节点归属于谁(肯定属于 $x$ 的最近点或 $x$ 父亲最近点). 这里的话肯定可以二分出拐点(拐点以前属于 $x$,拐点以后属于 $y$)
阅读全文
摘要:往届学长的一场比赛. 总结:三道水题 haha! Task 1 省选 jloi.cpp/in/out 给你一个字符串,你每次只能删除一个回文串,问你最少需要几步将字符串删完,或输出无解. 题解:显然,答案最多为 2,而如果这个串本身就不是回文串答案就是 1,所以难点就是判断无解的情况. 手画几组发现
阅读全文
摘要:写代码时间:30-40min,调试时间:5min 我们发现,如果一个城市的一个点被选,则该城市其他点也都必须被选,可以考虑用点分治来解. 假设当前分治到的重心为 $x$,则只需考虑必经 $x$ 的连通块即可. 我们可以维护一个队列,开始的时候将重心的颜色放入,然后对每一种颜色的所有节点进行扩展:向上
阅读全文
摘要:没调完呀,感觉代码能力还是有待提高...... 写代码一定要讲究结构 + 逻辑性. 如果结构或者逻辑性不好的话是非常非常遭罪的 QAQ...... upd:好像调了 5 分钟就过了 这个问题等价于求:$x$ 能到达一个点集, $y$ 也能到达一个点集,这两个点集是否有交集 ? 由于是否到达只有边权最
阅读全文
摘要:手完一下发现对于两个点求 LCA 来说,最优策略是对于 DFS 序相近的两个点去求. 所以把所有点按照 DFS 序排序,然后相邻两个依次求一下就行了. code: #include <bits/stdc++.h> #define ll long long #define N 100007 #defi
阅读全文
摘要:第一次做交互题,感觉挺有趣的. 对于链的部分,可以随机一个点拓展,直到拓展到该点为止. 但是最坏情况下可能每次都要询问两次(每次左右端点都选错). 据说随机化情况下出错的次数大概为 $O( \log n)$ 次. 对于树的部分最暴力的做法是从根节点开始询问,暴力拓展到叶子. 假设钦定一条从根节点向下
阅读全文
摘要:对于树边直接转移,然后按照套路拆环,在环上做一个单调队列 DP. 一种方案虽然在一个换上可能算不了,但是一定可以在另一个环上计算到. 仙人掌上 DP 的套路就是遇到树边就按照树上做,遇到环就拆环,做一个环形 DP. code: #include <bits/stdc++.h> #define N 2
阅读全文
摘要:第一道仙人掌题. 由于仙人掌中每条边最多只属于一个环,所以两个在环中的点的最短距离是好算的. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s".in","r",stdin) using namesp
阅读全文
摘要:对于树的情况是简单的. 我们 DFS 这颗仙人掌,对于树边正常转移就行. 然后对于环,我们把环拿出来,然后强制讨论端点选/不选再跑一遍 DP 就行. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s"
阅读全文
摘要:开始的时候没有借助圆方树去思考,思路非常混乱,想了很长时间后冷静下来发现这题不就是分类讨论简单题嘛... 题目不难,分两种情况讨论: 设当前点为中间点(圆点) 起点从一个儿子的子树进入到中间点后进入到另一个儿子的子树. 起点从一个儿子的子树进入到中间点后仍然回到该儿子子树中(相当于上一条的子问题)
阅读全文
摘要:一定注意,这里不要写错: $low[y]>=dfn[x]$,开始的时候把 $dfn[x]$ 写成 $low[x]$ 调了一下午...... 然后根据圆方树优美的性质,我们发现题中要求的就是圆方树上一些点构成的树链的并中圆点个数. 这个问题可以用虚树或树链的并解决. code: #include <c
阅读全文

浙公网安备 33010602011771号