杂题记录及简要题解

Posted imaginec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杂题记录及简要题解相关的知识,希望对你有一定的参考价值。

以下是大概 5 月初开始做的一些题。以前的简要题解都是骗人的。这次真的是简要题解了(大雾

相对之前改良了一下题目名称的格式。

2017 计蒜之道 初赛 - 腾讯狼人杀

二分答案 \(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\) 之后直接做最大权闭合子图即可。

THUPC 2018 - Citing

将矩阵转化为线性序列后相当于是要做匹配,可以直接用 FFT。

集训队作业 2018 - 复读机

  • \(d = 1\):答案为 \(k^n\)
  • \(d = 2\):使用生成函数来表示,答案为 \(n![x^n]\left(\sum_\limits{i = 0}^n [d | i] \frac{x^i}{i!}\right)^k\),化简后是求 \(\frac{n!}{2^k} [x^n](e^x + e^{-x})^k\),二项式定理展开后直接 \(O(k)\) 算就可以了。
  • \(d = 3\):还是套用上面的生成函数的式子。使用单位根反演,二项式定理展开后最终是要求 \(\frac{n!}{3^k} [x^n] \sum_\limits{i = 0}^k\binom{k}{i} \sum_\limits{j = 0}^{k - i} \binom{k - i}{j} e^{(i + \omega_3j +\omega_3^{2}(k - i - j))x}\),直接 \(O(k^2)\) 算即可。

ZJOI 2019 - Minimax 搜索

根节点权值改变必然只会变成 \(W + 1\)\(W - 1\),且若变成 \(W + 1\),则只会修改权值 \(< W\) 的点;若变成 \(W - 1\),则只会修改权值 \(> W\) 的点(修改 \(W\) 本身除外)。

为了方便,我们计算使用能量至多为 \(k\) 时的方案数,这样恰好为 \(k\) 的答案可以通过差分得到。可以对两部分的点的贡献分别做 dp。为了防止出现重复,使用补集转化后改为算两部分点中修改后根节点权值不变的方案数。注意到使用能量上限每增加 \(1\),最多只会有两个叶子结点会新产生贡献,于是做动态 dp 就可以了。需要注意一些细节的讨论。

ZJOI 2019 - 语言

树上差分之后用线段树合并来维护树链的并,就可以算单个点的答案。总答案为所有点的答案和除以 \(2\)

ZJOI 2019 - 浙江省选

\(m = 1\) 相当于做一次这个题

\(m > 1\) 时就做多次,做第 \(k\) 次就相当于求出所有答案为 \(k\) 的直线。单次具体的做法为求出所有剩下直线构成的凸壳,然后用所有答案为 \(1 \sim k - 1\) 的直线对凸壳做区间覆盖,那么一条凸壳上的直线答案为 \(k\) 当且仅当这条直线上存在一个部分被覆盖的次数为 \(k - 1\)。可以二分找每一条答案为 \(1 \sim k - 1\) 的直线在凸壳上的覆盖区间,然后离线做一次扫描线。

HNOI 2019 - 白兔之舞

使用单位根反演。那么对于 \(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}}\) 就可以做卷积了。

JSOI 2019 - 精准预测

2-SAT + bitset。每个点直接存整幅图的 bitset 会导致空间不够,可以分成多次做。

JSOI 2019 - 神经网络

假设 \(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)\)。排成环的话只需要强制使得一棵树包含某个结点的链为序列的第一条链,特殊处理一下这棵树的生成函数即可。

JSOI 2019 - 节日庆典

对于一个前缀,可能作为答案的位置只有 \(O(\log n)\) 个。可以直接维护所有位置的集合,然后暴力枚举最优答案。在做最优答案的比较时,发现形式一定是某个后缀与整个串求 lcp,所以可以用 exkmp。

TJOI 2019 - 唱、跳、rap 和篮球

答案为 \(\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)\)

TJOI 2019 - 甲苯先生和大中锋的字符串

建后缀自动机然后差分。

CEOI 2017 - One-Way Streets

缩完边双后模拟。

CEOI 2017 - Sure Bet

枚举两边选取的总数,然后三分。

CEOI 2017 - Mousetrap

\(t\) 点设为根。显然老鼠最终被卡在了一个点后,将这个点到根的路径上的所有支路都堵住最优。可以做一次 dp 预处理出老鼠从每个点出发,被卡在子树内的某个点,最终到 \(t\) 的最小操作次数。

问题是老鼠在最开始可能会往上走。不好直接做,可以二分答案然后从 \(m\) 点暴力往上跳,把支路中不合法的点堵住,判断总操作次数是否足够即可。

CEOI 2017 - Building Bridges

斜率优化 + 分治。

CEOI 2017 - Palindromic Partitions

根据 border 的性质可以证明贪心是对的。

CEOI 2017 - Chase

\(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。

APIO 2016 - Gap

  • \(T = 1\):从两边往中间逼近即可求出整个序列。
  • \(T = 2\):将 \([a_1, a_N]\) 分成尽量相等的 \(n - 1\) 部分,那么差分值最大的两个数必然不会位于同一部分,可以顺次扫所有区间并记录答案。

IOI 2016 - molecules

若有解,可以证明一定存在一种解是排序后的一段连续区间。直接双指针扫一下即可,也可以二分。

IOI 2016 - railroad

可以将速度值看做结点来建图,对于每一段路 \((s_i, t_i)\),从 \(s_i\)\(t_i\) 连边,再连接一条从 \(+\infty\)\(1\) 的边。现在可以额外加一些从 \(x\)\(x + 1\) 代价为 \(0\) 的边,或者从 \(x + 1\)\(x\) 的代价为 \(1\) 的边。那么问题即为用最少的代价使整幅图构成欧拉回路。

欧拉回路满足经过每一段 \((x, x + 1)\) 的方向向右的边与方向向左的边数量相同,于是可以差分求最小代价。注意这样可能会使一些差分值为 \(0\) 的部分没有边,导致图不连通,所以最后还要做一次最小生成树。

以上是关于杂题记录及简要题解的主要内容,如果未能解决你的问题,请参考以下文章

[题解]noip杂题题解

『图论杂题题解』

第七届“新星杯”程序设计大赛--补题简要题解及思路(11/12)

AtCoder 杂题集

AtCoder 杂题集

[题解][Codeforces] Round_615_Div. 3 简要题解