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)

题意:给你一个带权无向图,让你选一个边集,满足:

  1. 没重边 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)\)

posted @ 2022-12-06 22:29  grass8woc  阅读(208)  评论(1编辑  收藏  举报