标签:ons 自动机 要求 问题 检验 zjoi ali 语言 根据
以下是大概 5 月初开始做的一些题。以前的简要题解都是骗人的。这次真的是简要题解了(大雾
相对之前改良了一下题目名称的格式。
二分答案 \(x\) 后原问题变为检验是否存在选取方案 \((V, E)(|V| = k)\) 使得 \(\sum_\limits{e \in E} w_e - xk \cdot (2n- k)\)。式子可以写成 \(\sum_\limits{e \in E} w_e + \frac{k(k - 1)}{2} \cdot 2x - (2n - 1) \cdot xk\),每个点代价设为 \((2n - 1) \cdot x\),每条边边权加上 \(2x\) 之后直接做最大权闭合子图即可。
将矩阵转化为线性序列后相当于是要做匹配,可以直接用 FFT。
根节点权值改变必然只会变成 \(W + 1\) 或 \(W - 1\),且若变成 \(W + 1\),则只会修改权值 \(< W\) 的点;若变成 \(W - 1\),则只会修改权值 \(> W\) 的点(修改 \(W\) 本身除外)。
为了方便,我们计算使用能量至多为 \(k\) 时的方案数,这样恰好为 \(k\) 的答案可以通过差分得到。可以对两部分的点的贡献分别做 dp。为了防止出现重复,使用补集转化后改为算两部分点中修改后根节点权值不变的方案数。注意到使用能量上限每增加 \(1\),最多只会有两个叶子结点会新产生贡献,于是做动态 dp 就可以了。需要注意一些细节的讨论。
树上差分之后用线段树合并来维护树链的并,就可以算单个点的答案。总答案为所有点的答案和除以 \(2\)。
\(m = 1\) 相当于做一次这个题。
\(m > 1\) 时就做多次,做第 \(k\) 次就相当于求出所有答案为 \(k\) 的直线。单次具体的做法为求出所有剩下直线构成的凸壳,然后用所有答案为 \(1 \sim k - 1\) 的直线对凸壳做区间覆盖,那么一条凸壳上的直线答案为 \(k\) 当且仅当这条直线上存在一个部分被覆盖的次数为 \(k - 1\)。可以二分找每一条答案为 \(1 \sim k - 1\) 的直线在凸壳上的覆盖区间,然后离线做一次扫描线。
使用单位根反演。那么对于 \(t\),答案为 \(\frac{1}{k} \sum_\limits{j = 0}^{k - 1} \omega_k^{-jt}\left(\omega_{k}^jA + I\right)^L\)。其中 \(A\) 为给定的 \(n \times n\) 的边数矩阵。
后面的东西可以用矩阵快速幂先求出来。之后把前面的 \(\omega_k^{-jt}\) 化为 \(\omega_k^{\binom{j}{2} + \binom{t}{2} - \binom{j + t}{2}}\) 就可以做卷积了。
2-SAT + bitset。每个点直接存整幅图的 bitset 会导致空间不够,可以分成多次做。
假设 \(m\) 棵树分别被拆成了 \(a_1, a_2, \cdots , a_m\) 条链,那么答案即为每棵树拆分的方案数\(\times\)将这些链排列成环使得没有两条相邻的链来自同一棵树的方案数。
对于单棵 \(k\) 个结点的树,拆成 \(1 \sim k\) 条链的方案数可以在 \(O(k^2)\) 的时间内用 dp 算出。注意算每棵树拆分的方案数时,每有一条长度大于 \(1\) 的链还应乘以系数 \(2\),因为链长度大于 \(1\) 时,可以选择从链的两端中任意一端进入。
剩余的部分用生成函数做。可以用容斥减掉同一棵树上的链相邻的方案数。把同一棵树上相邻的链看做整体后,本质上是对所有链做可重集排列,因此单棵树的生成函数为 \(\sum_\limits{i = 1}^k i! f_i \sum_\limits{j = 0}^{i}(-1)^{j} \binom{i - 1}{j} \frac{x^{i - j}}{(i - j)!}\),其中 \(f_i\) 为该棵树拆成 \(i\) 条链的方案数。先不考虑把所有链排成环,只考虑排成序列。记所有树的生成函数的卷积为 \(G(x)\),那么答案为 \(\sum_\limits{i = 1}^{+\infty} i![x^i]G(x)\)。排成环的话只需要强制使得一棵树包含某个结点的链为序列的第一条链,特殊处理一下这棵树的生成函数即可。
对于一个前缀,可能作为答案的位置只有 \(O(\log n)\) 个。可以直接维护所有位置的集合,然后暴力枚举最优答案。在做最优答案的比较时,发现形式一定是某个后缀与整个串求 lcp,所以可以用 exkmp。
答案为 \(\sum_\limits{i = 0}^{\left\lfloor\frac{n}{4}\right\rfloor} (-1)^i \binom{n - 3i}{i} \times (n - 4i)! [x^{n - 4i}]\left(\sum_\limits{j = 0}^{a - i} \frac{x^j}{j!}\right)\left(\sum_\limits{j = 0}^{b - i} \frac{x^j}{j!}\right)\left(\sum_\limits{j = 0}^{c - i} \frac{x^j}{j!}\right)\left(\sum_\limits{j = 0}^{d - i} \frac{x^j}{j!}\right)\)。
建后缀自动机然后差分。
缩完边双后模拟。
枚举两边选取的总数,然后三分。
将 \(t\) 点设为根。显然老鼠最终被卡在了一个点后,将这个点到根的路径上的所有支路都堵住最优。可以做一次 dp 预处理出老鼠从每个点出发,被卡在子树内的某个点,最终到 \(t\) 的最小操作次数。
问题是老鼠在最开始可能会往上走。不好直接做,可以二分答案然后从 \(m\) 点暴力往上跳,把支路中不合法的点堵住,判断总操作次数是否足够即可。
斜率优化 + 分治。
根据 border 的性质可以证明贪心是对的。
记 \(s_i\) 表示所有和 \(i\) 相邻的点的 \(F\) 之和。假设选定的一条链为 \(\{a_1, a_2, \cdots , a_k\}\),那么缩掉点 \(a_1\) 的收益为 \(s_{a_1}\),缩掉任意 \(a_i(i > 1)\) 的收益为 \(s_{a_i} - F_{a_{i - 1}}\)。问题的本质还是求最长链,可以直接做树形 dp。
若有解,可以证明一定存在一种解是排序后的一段连续区间。直接双指针扫一下即可,也可以二分。
可以将速度值看做结点来建图,对于每一段路 \((s_i, t_i)\),从 \(s_i\) 向 \(t_i\) 连边,再连接一条从 \(+\infty\) 到 \(1\) 的边。现在可以额外加一些从 \(x\) 到 \(x + 1\) 代价为 \(0\) 的边,或者从 \(x + 1\) 到 \(x\) 的代价为 \(1\) 的边。那么问题即为用最少的代价使整幅图构成欧拉回路。
欧拉回路满足经过每一段 \((x, x + 1)\) 的方向向右的边与方向向左的边数量相同,于是可以差分求最小代价。注意这样可能会使一些差分值为 \(0\) 的部分没有边,导致图不连通,所以最后还要做一次最小生成树。
标签:ons 自动机 要求 问题 检验 zjoi ali 语言 根据
原文地址:https://www.cnblogs.com/ImagineC/p/10802848.html