11-05 题
- P7468 [NOI Online 2021 提高组] 愤怒的小 N - 洛谷
- CF1938M - 2024 ICPC Asia Pacific Championship
- CF1466H Finding satisfactory solutions - 洛谷
- P8147 [JRKSJ R4] Salieri - 洛谷
- CF1770F Koxia and Sequence - 洛谷
- P4338 [ZJOI2018] 历史 - 洛谷
- P11057 诈骗题 - 洛谷
- P11056 Fire and Big - 洛谷
- P11058 合并香蕉 - 洛谷
- P9818 游戏王 - 洛谷
- P7013 [CERC2013] History course - 洛谷
- Endless Road - 题目 - QOJ.ac
- 生不逢时 - LibreOJ 6878 - Virtual Judge
- One, Two, Three - QOJ 6537 - Virtual Judge
- Balanced Rainbow Sequence - Baekjoon 23674 - Virtual Judge
P11057 诈骗题 - 洛谷
考虑二分图模型,一个 \((x,y,R)\) 从左部点 \(x\) 向右部点 \(y\) 连边,一个 \((x,y,C)\) 从右部点 \(y\) 向左部点 \(x\) 连边,那么限制相当于每个点只能有一条出边。容易发现最多连 \(n+m-1\) 条边就不能连了,所以最后要求形成一棵内向树。
相当于对 \(n,m\) 个点的完全二分图求有根生成树个数,转化为求无根树个数,答案乘上 \(n+m\) 即可。
考虑 Prufer 序列,每次删一个左部点有 \(m\) 种方案,删一个右部点有 \(n\) 方案,最后会剩下左右部各一个点,即为一个长 \(n+m-2\) 的序列,有 \(n\) 个右部点,\(m\) 个左部点,方案数为 \(n^{m-1}m^{n-1}\)。
P11056 Fire and Big - 洛谷
发现与 \(n\) 同余的数最多只有一个必败点,所以最多 \(O(n)\) 个必败点。
具体地打表出来有恰好 \(n-1\) 个必败点,考虑直接转移出这 \(n-1\) 个必败点,每次从一个必败点枚举 \(\sqrt n\) 种转移。
可以证明必败点最大是 \(O(n\sqrt n)\) 级别的(也可打表猜测),所以可以开一个 \(O(n\sqrt n)\) 的 bitset 存储每个数是否是必败点。
P7468 [NOI Online 2021 提高组] 愤怒的小 N - 洛谷
考虑倍增,设多项式
\(G_i(x)\) 同理为要求\(s_i=b\)。那么有转移:
\(G\) 的转移式同理,可以把 \(G_i(x+2^i)\) 二项式定理展开,求出多项式 \(G_i'(x)=G_i(x+2^i)\) 的系数。可以做到 \(O(k^2\log n)\) 转移。
求答案时,从高到低位拆解出 \(2^{t_1}+2^{t_2}+\dots\),发现答案就是 \(G_{t_1}(0)+F_{t_2}(2^{t1})+G_{t_3}(2^{t1}+2^{t2})+\dots\),\(F,G\) 交替出现。所以总复杂度 \(O(k^2\log n)\)。
结论:当 \(i\ge k\) 时,\(F_i(x)=G_i(x)\)。
证明:设 \(H_i(x)=F_i(x)-G_i(x)\),把上面 \(F,G\) 的转移式相减,可以得到
假设 \(H_{i}(x)\) 的最高次项为 \(qx^p\),发现 \(H_i(x+2^i)\) 的最高次项也为 \(qx^p\),所以 \(H_{i+1}(x)\) 的次数每次转移会减一。所以 \(H_k(x)=0\),得证。
这个结论也可打表发现,有了这个结论后,对于 \(n\) 中 \(\ge 2^k\) 的项,考虑拉插求 \(\dfrac 12\sum _{i=0}^{n\bmod 2^{k-1}} f(i)\)。复杂度 \(O(\log n+k^3)\)。
P11058 合并香蕉 - 洛谷
设 \(c_i\) 为 \(i\) 合并的次数。则贡献表示为 \(\sum a_ik_i^{-c_i}\)。
结论:最优情况下,\(c_i\) 构成的可重集合为 \(\{1,2,3,\dots,n-2,n-1,n-1\}\)。证明比较复杂。
考虑到答案精度要求 \(10^5\),所以当 \(c_i>50\) 时对答案没有影响,所以考虑每个 \(k\) 保留前 \(50\) 大的 \(a_i\),对 \(50\) 个 \(c_i\) 在二分图上跑费用流即可,复杂度 \(O(k^2\log^4 V)\)。
注意费用流要开 long double。
P9818 游戏王 - 洛谷
考虑到 \(\lfloor \frac v {\prod m} \rfloor\) 只有 \(2\sqrt v\) 种,所以我们记录 \(\lfloor \frac v {\prod m} \rfloor\)。每次加入一个 \(m'\) 只需 \(v/(\prod m\times m')=(v/\prod m)/m'\) 即可。
考虑猫树分治,现在的问题是已知 \(a=v/\prod m,b=v/\prod n\),怎么知道它们可以合并。有一个神奇的结论:把所有 \(v/x\) 的不同值记录在数组 \(s_1,s_2,\dots,s_{cnt}\) 中,那么对于 \(a=s_i\),可行的 \(b\) 要满足 \(b\ge s_{cnt-i+1}\),即在 \(s\) 中的位置要在 \(cnt-i+1\) 之前。
复杂度 \(O(n\log \sqrt v)\)。
P8147 [JRKSJ R4] Salieri - 洛谷
考虑二分答案,我们需要求出 \(cnt\times v\ge mid\) 的个数。
考虑在 AC 自动机上跑匹配。可以对所有走到的点建出虚树,那么虚树的每条虚边(对应原树上一条链)上的 \(cnt\) 都相等。那么链上所有 \(v\ge mid/cnt\) 的会被计数,可持久化线段树维护即可。
复杂度两个 \(\log\)。
P7013 [CERC2013] History course - 洛谷
最大值最小,考虑二分答案 \(mid\)。
考虑一个贪心的策略,假设枚举到位置 \(i\),将填入位置 \(i\) 的区间。
对每个未被填入区间处理 \(f_x\) 表示其要在位置 \(f_x\) 之前填入否则就会不合法,初始 \(f_x=n\)。
那么处理出 \(s_k=\sum [f_x=k]\)。若存在 \(s_k>i-k+1\) 则不合法,否则我们找到第一个满足 \(s_j=i-j+1\) 的位置 \(j\),则所有 \(f_x\in [i,j]\) 的区间要填入位置 \([i,j]\) 内。可以贪心地找到这之中 \(r\) 最小的区间然后填入 \(i\),因为这会使限制的区间最少,然后对所有有交的区间更新 \(f_x\)。
于是我们就得到了一个 \(O(n^2\log n)\) 的做法。可以通过 CF309E Sheep。
考虑线段树维护上述贪心的过程,找到 \(j\) 可以把每个 \(s_k\) 减去 \(1\),然后转化为求区间内 \(s_k\) 前缀和的最大值,可以线段树维护区间和与区间前缀和最大值。
而对找到满足最小的 \(f_x\le j\) 的最小 \(r\),可以对所有区间按左端点排序,因为每个区间第一次被交时的限制是最紧的,所以可以维护一个指针,新限制区间时指针往后移,同时这样满足 \(f_x\le j\) 的就是一段前缀,可以在移动指针结束后求出最后一个满足 \(f_x=j\) 的位置 \(g_j\)。
复杂度 \(O(n\log^2 n)\)。
P4338 [ZJOI2018] 历史 - 洛谷
考虑到每个国家控制的城市任何时刻都是从它开始连续的一段祖先。所以考虑若 \(x,y\) 先后崛起有贡献,那么可以把贡献放在它们的 LCA 处。
考虑每个点最多有多少贡献,那么连续两次不选到同一子树就有一贡献,所以当 \(2\max sz_v>sz_x\) 贡献为 \(2(sz_x-\max sz_v)\),否则为 \(sz_x-1\)。
因为每个点只关心从选哪个子树,发现一定有一种方案使得每个点的最大贡献都能取到,答案就是所有点的贡献之和。复杂度 \(O(qn)\)。
正解:考虑对于原来 \(2sz_i>sz_p\),那么操作后依然满足 \(2sz_i>sz_p\);而对于 \(2sz_i\le sz_p\) 的点只有 \(O(\log V)\) 个,可以线段树跳到这些点上然后暴力修改(每次只需跳到下一个 \(\ge 2sz_x\) 的点即可),复杂度两个 $\log $。