test20190830

闲扯

今天的考试比昨天友好多了,起码大佬们讲的东西大多数都还是听得懂。

不过话说 $DC$ 少爷机还真是强啊,暴力跑过了 $8$ 个点。

题面

$T1$

又要维护连续编号的节点的子树和,又要支持单点修改,问题就变得十分不可描述起来,因为貌似没法用线段树之类的来一起维护。

考虑分块。将编号 $1\sim n$ 分为 $\sqrt{n}$ 块。

先用 $DFS$ 预处理出每个点的 $dfn$ 序以及从该点到根节点对每一个块的贡献次数。

询问时,整块的部分直接调用答案,对于边角部分利用求出的 $dfn$ 序,用树状数组查询。(树状数组是以 $dfn$ 序为下标,维护子树和)

修改时,先对树状数组进行单点修改,然后枚举对每一个块的贡献次数,直接修改块的答案。

$T2$

对于求一个图中的生成树个数,考虑使用矩阵树定理

矩阵树定理

先构造出该图的基尔霍夫矩阵,因为是一个完全二分图,可以发现是十分有规律的,写出该矩阵的余子式。

这个矩阵的行列式就是答案。

我们可以将它分为 $4$ 个区域,左下角和右上角全是 $-1$ 。

左上角是一个 $n\times n$ 的对角矩阵,对角线上的元素都是 $m$ 。

右下角是一个 $(m-1)\times(m-1)$ 的对角矩阵,对角线上的元素都是 $n$ 。

因为这个矩阵十分特殊,我们直接尝试算它的行列式。

详细计算过程见 $jklover$ 大佬的 $blog$

$T3$

将两种移动方式看做两个向量 $\vec{a},\vec{b}$ 。因为题目保证它们不共线,所以每个点都可以被写成 $x\cdot\vec{a}+y\cdot\vec{b}$ 。

以解出来的 $(x,y)$ 代替原来的坐标,就变成了每次可以向右或向上走一步,可以直接舍去坐标转换后不是整点的点,要求不能经过障碍点,求起点到终点的方案数。

如果没有障碍,答案显然是 $C_{x+y}^x$ (一共要走 $x+y$ 步,从中选出 $x$ 步为向左走的)。

但现在有障碍,直接递推显然不行,因为新坐标的大小可以达到 $2\times 500^2$ 。

将障碍点,目标点视为关键点,记原点为 $0$ 号关键点。

坐标转换后,按照 $x$ 为第一关键字, $y$ 为第二关键字排序,就做出了一个拓扑序,再进行 $DP$ 。

设 $f(i)$ 表示从原点到第 $i$ 个关键点,其间不经过其他关键点的方案数。

$g(i)$ 表示从第 $i$ 个关键点到第 $j$ 个关键点的所有方案数。

转移有 $f(i)=g(0,i)-\sum\limits_{j=1}^{i-1}g(j,i)\cdot f(j)$ 。而 $g$ 不需要考虑障碍,若能到达就是组合数,否则就是 $0$ 。

总结

就一个字——菜

做题还是没掌握到套路,需要多练习。