12月杂题
whk 自闭,尤其是英语和化学。最近状态有点掉了。
会按自己的感觉,按照 NOIP 难度打分。
一.gym100212I(T2)
题意:给你一个二分图,你要保留一些边使得每个点度数 \(\geq 2\) ,要让保留的边最少。
\(n,m\le 300\) 。(两边的点数)
做法:直接建图,跑上下界最小流。但是更聪明的做法是倒着思考,当成先把所有边加上,再删边,就是普通的最大流了。
二. AGC029F(T3.5)
题意:给你 \(n-1\) 个集合,在每个集合里选两个数 \(u,v\) ,在一个图里连边 \((u,v)\) ,要使得最后成为一棵树。
\(n\le 10^5\) ,\(\sum |S|\le 2*10^5\)
做法:11月杂题的四。原来自己能独立想出来一个 AGC F!
三. ARC149D(T2.5)
题意:你一开始有一个数 \(x\) ,有 \(m\) 个操作, 第 \(i\) 次是这样的:如果 \(x>0\) 则 \(x:=x-a_i\) ,若 \(x<0\) 则 \(x:=x+a_i\) 。当 \(x=0\) 时停止操作。
给出 \(n\) 个 \(x\) 的初始值 \(x_i\),如果 \(x\) 会变成 \(0\), 输出变成 \(0\) 是操作了多少次;否则输出 \(x\) 最后等于多少。
\(0<n,m,|x_i|,a_i\le 10^6\)
做法:这个操作有强烈的对称性。知道了 \(x\) 的答案就能知道 \(-x\) 的答案。
所以我们一直压缩状态,把这种传递关系建出一棵树。
四. CF757F(T3)
题意:无向图,边正权。有一点 \(s\) ,你要选择一个点 \(u(u!=s)\) ,使得删掉点 \(u\) 后有尽量多的点到 \(s\) 的最短距离改变。输出这个最多的点的个数。
\(n\le 2*10^5,m\le 3*10^5\)
做法:先跑一遍最短路,保留 \(dis[u]+w=dis[v]\) 的边。发现形成了一个 DAG 。
问题转化成在 DAG 删一个点,使得 \(s\) 不能到达的点最多。可以直接上 [模板]支配树。但是我不会(后面再学)。
很神的是,考虑入度为 \(1\) 且入它的点 \(v\) 不等于 \(s\) 的一个点 \(u\) 。显然我们不会选 \(u\) ,可以把 \(u\) 缩到 \(v\) 里。
缩完之后,删掉任何一个点,剩下的点都能被 \(s\) 到达。就输出缩得的最大点集即可。
(草有照着打别人题解的感觉)
五.AGC005F(T2)
题意:给定一棵无根树,定义 \(f(i)\) 为对于所有大小为 \(i\) 的点集,能够包含它的最小连通块大小之和。对于所有 \(1\le i\le n\),求出 \(f(i)\)。
\(n\le 2*10^5\),模数是 NTT 模数。
做法:考虑每一个点 \(u\),有多少个点集构成的最小联通块包含它,容斥一下即可。
最后就能把答案整理成:\(f_i=\sum\limits_{j=0}^n \tbinom{j}{i}b_j\) 。差卷积。
六.AGC002F(T2)
题意: \(n\) 种颜色,每种颜色有 \(k\) 个球。你要把球排成一列,然后把每种颜色的第一个球染白。
问能得到的不同颜色序列个数。\(n,k\le 2000\)
做法:把 \(n\) 个白球和每种颜色的第二个球拿来当状态 dp 即可,因为由此可以顺势求出剩下的平凡球的填的方案。
七.ARC076F(T2.5)
题意: \(n\) 个人, \(m\) 把椅子。每个人都有自己的想法:想坐编号 \(\le l_i\) 或编号 \(\geq r_i\) 的。你可以添加一些"公共椅",大家都喜欢做“公共椅”。
问最少要添几把,能使所有人都坐上椅子。
做法:考虑霍尔定理。经过一定推导,\(val(i,j)=i+(m-j+1)-\sum [l_k\le i\land j\le r_k]\) 。求出 \(val(i,j)\) 最小值即可。用线段树维护。
注意答案对 \(n-m\) 取 max。
八.AGC024F(T3.5)
题意(转化后):给你一些 \(01\) 串(长度 \(\le N\)) 。你要对于每一个长度 \(\le N\) 的 \(01\) 串 \(T\) 求出:给出的串里有多少个满足存在一子序列等于 \(T\) 。
\(N\le 20\) 。
做法:ex子序列自动机(bushi)好神啊反正。
考虑 \(S\) 匹配 \(T\) 的过程,一定是贪心的,走法是唯一的。
我们把 \(T\) 和 \(S\) 还未参与匹配的后缀一起记下来,建成一个点岂不美哉。
然后就走出来了一条确定的路径,途径了一些确定的点。这里点数是 \(O(2^nn)\) 的,边数同阶。
这个就是自动机了,我们把它建出来跑拓扑排序 dp 就好了。
九.Topcoder12432 (T2.5)
题意:给你一个 \(n*m\) 网格,有一些障碍物。你要在空位修铁路,可以直着修或者弯着修,要让这些铁路形成若干个环,一些特殊点上直着修会有 \(1\) 的费用。
求最小费用或报告无解。 \(n,m\le 25\)
做法:考虑先黑白染色,每个点度数为 \(2\) 和 “形成若干个环” 是等价的,所以判断有无解,就相当于给你一个二分图,你要选若干条边,使得每个点度数为 \(2\) 。
跑一遍网络流就行了。接下来考虑费用的处理:我们可以把一个点与之相邻的四个点分成两类,一类是横着走到的,一类是竖着走到的,如果它选的两个点是同一类,且是特殊点,就有 \(1\) 的费用。
由此,可以对于每个点 \(u_0\) 新建 \(u_1\) 和 \(u_2\) ,\(u_0\) 与 \(u_i\) 间连两条边容量为 \(1\) 的边,如果 \(u_0\) 是特殊点,就把其中一条边费用赋 \(1\) 。这样就做完了。
十.Topcoder11054 (T3)
题意:给你一个无向完全图,每个边有非负边权。你要选一个点集 \(S\) ,令 \(C=|S|(200-|S|)\) ,\(W\) 是两个点均在 \(S\) 内的边的边权和,你要使 \(W/C\) 最大。
\(n\le 50\) 。
做法:首先考虑二分答案,转化成求 \(W-CK\) 的最大值。
展开,即 \(\sum w -200k|S|+k|S|^2\) 。这个 \(|S|^2\) 很烦,但是很绝的一步是:
考虑这里恰好有 \(1/2(|S|^2-|S|)\) 条边,这不就能消二次项了吗。
转化为 \(\sum (w+2k)-199k|S|\) 。问题转化成:让 边权和-点权和 最大。
可以用最小割解决这个问题: 对于原图每一个边建一个左部点 \(u\),对每一个原图的点建一个右部点 \(v\) ,剩下的就很好处理了。
十一.CF1209G2 (T3)
题意:一个染色方案合法,当且仅当每个颜色都构成了连续的一段。
每次操作可以把一个颜色全部换成另一个。花费是改变了颜色位置的个数。给出初始颜色序列,求最小花费。
每次会单点修改一个位置的颜色,然后求最小花费。
\(n,q\le 2*10^5\)
做法:考虑最终状态:形成了若干段相同颜色。尝试确定这些段的左端点,再染色,花费就是 \(n\) 减去 每段的出现最多颜色次数之和。
如果一个颜色的最左处和最右处分别为 \(l,r\) ,则 \((l,r]\) 不能当左端点。满足这个限制都贪心的当左端点。至此有单次 \(O(n)\) 做法。
考虑动态维护?首先我们把颜色的信息集中到一个点上,这样才能更好处理“出现最多颜色次数”。
处理不合法分界线,就是一个区间加,然后所有为 \(\min\) 的位置是分界线。
所以我们对每个节点维护:当前答案,\(min\),最左块权值,最右块权值,即可。
十二.CF708D (T2.5)
题意:给你一个网络,源点为 \(1\) ,汇点为 \(n\) ,对于每个边有容量 \(c\) 和当前流量 \(f\) 。
每次可以把 \(c\) 或 \(f\) \(+1\) 或 \(-1\),求最小次数,使得 \(f\le c\) 且每个点流量守恒。
\(n,m\le 100\)
做法:我们建立一个超级源和超级汇来调整流量,和【上下界可行流】的做法类似。
十三.CF1392H (T3)
题意:给你 \(n\) 张普通牌和 \(m\) 张鬼牌,每次随机摸一张牌,如果是普通牌就丢掉,是鬼牌就把所有丢掉的牌捡回来。
如果某次摸到了鬼牌,并且此时所有普通牌都被摸过,那就结束游戏,求期望摸牌次数。
做法:摸一张鬼牌之前,摸的普通牌个数的期望是固定的,与终止条件无关,即 \(n/(m+1)\) (考虑每张牌在第一张鬼牌前的概率是 \(1/(m+1)\))
所以转化成摸鬼牌的期望次数。考虑:还剩 \(i\) 张牌是新牌,在摸到一张新牌前,期望会摸多少张鬼牌。
这里摸过的牌是没有影响的!所以期望等于 \((i+m)/i-1=m/i\) 。
摸完 \(n\) 个牌后,还会摸一次鬼。
综上,答案是 \((1+m\sum\limits_{i=1}^n 1/i)*(n/(m+1)+1)\) 。
十四.ABC283Ex (T2.5)
题意:计算 \(\sum\limits_{i=0}^T popcount(Mi+R)\) 。
做法:考虑 popcount 怎么处理,它实际上相当于,值一直 \(+1\) ,如果有进位,那这个 popcount 就会 \(-1\) 。
所以 \(popcount(x)=x-\sum\limits_{i\geq 1} \left\lfloor\dfrac{x}{2^i}\right\rfloor\) 。
由此,粘类欧板子即可,复杂度 \(O(\log^2 n)\) 。
十五.没有题号 (T3.5)
题意:给你一个带权无向图,让你选一个边集,满足:
- 没重边 2. 使 \(n\) 个点联通 3. 边权和模 17 的余数是 \(k\) 。
对于 \(k=0...16\) ,求出方案数。
\(n\le 17,m\le 10^5\) ,模数是 \(998244353\) 。
做法:
首先考虑没有边权限制,即所有边权都为 \(0\) ,怎么做。
这是个经典问题, 我们令 \(F(S)\) 表示点集 \(S\) 内,不要求联通,只要求没重边,选边的方案数,\(G(S)\) 表示要求联通,方案数。
则有 \(F=e^G,G=Ln F\) ,\(F\) 是很好算的;所以我们以 \(O(2^nn^2)\) 的复杂度算出了答案。
附:刚学的子集卷积 exp/Ln: 把普通子集卷积的暴力乘法,换成暴力 exp/Ln 即可。
现在考虑有边权怎么做?直接做是把原来的每个数都重载一个多项式,原来的乘法就成了循环卷积。这样是 \(O(2^nn^217^2)\) 的,并不能通过本题。
现在,我们尝试找到一个 \(W\) 使得 \(W^{17}\equiv1\pmod{998244353}\) 。有 \(W=503044\) 。
我们拿这个当单位根做 DFT 即可,很神奇吧。
为什么是对的,首先注意到我们做的是循环卷积,即 \(f_ig_j\) to \(h_{(i+j)\bmod {17}}\) 这样的形式。
那么普通的 DFT 并不能处理,因为你不能保证 \(f(x)g(x)=(f*g)(x)\) 。
但由于 \(W^{17}\equiv1\pmod{998244353}\),所以实际上它是满足 \(f(W)g(W)=(f*g)(W)\) 的,就很舒服。
然后复杂度就变成 \(O(17*2^nn^2)\) 了。注意这里 DFT 直接 \(t^2\) 暴力即可,并不能使用 \(O(t\log t)\) 的 DFT,因为那个需要保证是 2 的整次幂。
十六.AGC060D(T3.5)
题意:一对排列 \(P,Q\) 合法的条件:对于每个 \(1\le i <n\) ,都有 \([P_i<P_{i+1}]=[Q_i<Q_{i+1}]\) ,求合法的 \(P,Q\) 个数。
\(n\le 2*10^5\) 。
做法:
令 \(f(T)\) 表示:对于 \(i\notin T\) ,有 \(P_i<P_{i+1}\) 的排列 \(P\) 个数。
令 \(P_i>P_{i+1}\) 的位置集合为 \(S\) 。
如果确定 \(S\) ,则考虑容斥计算答案。枚举 \(P,Q\) 强制不合法的集合 \(a,b\subseteq S\) ,有方案 \((-1)^{|a|+|b|}f(S-a)(S-b)\) 。
改写成 \((-1)^{2|S|-|a|-|b|}f(a)f(b)=(-1)^{a}f(a)(-1)^{b}f(b)\) 。
现在,我们转为枚举 \(a,b\) ,则 \(S\) 个数为 \(2^{n-1-|a\cup b|}=2^{n-1-|a|-|b|+|a\cap b|}\) 。
踢开常数 \(2^{n-1}\)。如果没有 \(2^{|a \cap b|}\) ,这个题就做完了,传统 dp 计算 \(\sum (-\tfrac{1}{2})^{|a|} f(a)\) 即可。
现在记 \(x_i\) 表示 \(n=i\) 时 \(\sum (-\tfrac{1}{2})^{|a|} f(a)/n!\) 的值,这个 \(x_i\) 就能分治 NTT 算出来。
考虑 \(2^{|a\cap b|}\) 的组合意义,相当于枚举一个集合 \(c\) 满足 \(c\subseteq a\) ,\(c \subseteq b\) 。
转为枚举 \(c\) ,发现它相当于把 \(n\) 个数割成若干段,把答案加上 \((\tfrac{1}{4})^{|c|}\prod x_{len}^2\)。
这仍然能用分治 NTT 算出来。复杂度 \(O(n\log^2 n)\) 。也可以多项式求逆,复杂度 \(O(n\log n)\) 。
感觉这个题最重要的在于:最后枚举的 \(c\) ,含义不是强制连上,而是强制断开。常规的想法推下去会算不出来。
十七.AGC060C (T2.5)
题意:一个长度为 \(2^n-1\) 的排列,一个排列合法,当且仅当对于 \(1\le i \le 2^{n-1}\) ,有 \(p_i<p_{2i},p_i<p_{2i+1}\) 。
给出 \(n\le 5000\) ,以及 \(1\le u,v<n\) 。令 \(A=2^u,B=2^{v+1}-1\) ,求所有合法排列中 \(p_A<p_B\) 的概率。
做法:
这个相当于给你一个满二叉树,要从上往下的顺序染黑。
把所有染黑的点删掉后形成了一个森林。那么 \(A,B\) 一定不在一棵树里。\(A,B\) 都不在的树我们可以忽略。
于是令 \(f_{i,j}\) 表示 \(A\) 所在的树,根在原树深度为 \(i\) ,\(B\) 所在的为 \(j\) ,\(A\) 被先染黑的概率。
转移是简单的,复杂度 \(O(n^2)\) 。