联合省选2021 完整题解
详略程度和难度无关。
A卷 Day1T1 卡牌游戏
考虑枚举最小值minv(minv一定是某个a或b,排序之后枚举即可).此时只需令最大值最小即可(当然要满足m的限制)。
为了满足最小值的限制,我们要翻一个前缀[1,Lt].显然Lt关于minv非严格增。注意特判翻出的b<minv的情况。
为了令最大值最小,我们要翻一个后缀[Rt,n].注意Rt要满足m和minv的限制。
考虑比较[Rt,n]和[Rt+1,n].前者导致的最大值是max(SufmaxRt,aRt−1),后者导致的最大值是max(SufmaxRt+1,aRt).如果后者更小则增加Rt即可(注意同样优时也要增加Rt, 因为可能这个函数有一段平的,之后的某个位置才变小)
此外,当minv增大时Rt的下界会增大,其余不变,因此最优的Rt也是非严格增的,在上一个的基础上继续往右走即可。
瓶颈在于排序,为O(nlogn)或O(n)
A卷 Day1T2 矩阵游戏
首先构造一个符合和的限制但不符合值域限制的矩阵M.这是很容易的,钦定第一行与第一列均为0 ,其余便可唯一推出。
考虑能怎样修改使其合法。为了使和的限制不被破坏,一定是若干次(可能为负)以下两种操作:
- 对某一行,奇数列+1,偶数列-1
- 对某一列,奇数行+1,偶数行-1
这样就简单了,设第i行操作xi次,第j列操作yj次,每个位置(i,j)的限制形如:
Mi,j+xi+yj∈[0,106](1,1)Mi,j−xi+yj∈[0,106](1,0)Mi,j+xi−yj∈[0,106](0,1)Mi,j−xi−yj∈[0,106](0,0)
(1,1)表示i,j都为奇数,其余同理。
恭喜,这样是没法做的
接下来是难以想到的操作:将xi,yj略作修改,具体的,对i\mod 2=1,x_i:=-x_i,对j\mod 2=0,y_j:=-y_j.这样操作之后,限制形如:
\begin{align}
M_{i,j}-x_i+y_j\in[0,10^6]\quad (1,1)\\\\
M_{i,j}+x_i-y_j\in[0,10^6]\quad (1,0)\\\\
M_{i,j}+x_i-y_j\in[0,10^6]\quad (0,1)\\\\
M_{i,j}-x_i+y_j\in[0,10^6]\quad (0,0)\\\\
\end{align}
都是两个变量的差的不等式,可以转化为差分约束模型求解,以M_{i,j}-x_i+y_j\ge 0为例:\Rightarrow y_j+M_{i,j}\ge x_i,令第j列代表的点向第i行代表的点连边权为M_{i,j}的边。
或者你也可以先猜到是用差分约束,然后把初始形式转化为差分约束的形式。
复杂度即O(Check_Negative_Ring(n+m,nm)) 。用spfa/Floyd 实现即可。
A卷D1T3 图函数
考虑有序对(u,v)在G中产生贡献的条件:存在一个环R经过u,v且u为R上编号最小的。
进一步,若求出T(u,v)表示所有R中边的编号最小值最大的,那么(u,v)会对所有i\le T(u,v)的G_i产生贡献。
考虑如何求T(u,v).
我的做法是,考虑Floyd的过程是加入中转点k,且加入S中所有点作为中转点后,我们求出的最短距离dis(u,v)表示u到v只经过S\cup\{u,v\}中的点的所有路径中边的编号最小值的最大值。
那么,若从大到小加入k,此时(u,v)的路径上所有点编号都\ge k.枚举v\ge k,T(k,v)=\min(dis(k,v),dis(v,k)).
时间复杂度O(n^3),但循环展开之后能过!
也有O(nm)的做法,大致思路类似。
A卷 Day2T1 宝石
关注P_i互不相同 的性质。这个性质指出,如果起点在u的子树内且匹配到了u且终点为根,那么下一个匹配点是唯一确定的(上一个也是)。因此,下x个匹配点也是唯一确定的。预处理每个点往上第一个匹配P_1的点u,然后可以倍增找出最多能匹配的数量,这样就O(n\log c)预处理,O(\log c)每次查询的复杂度解决了链上的问题。
对于一般情况,s\rightarrow LCA的部分同样可以这样处理,记匹配到p。对于LCA\rightarrow t的部分,考虑二分答案。设当前要判断能否匹配[p+1,k] .先离线求解t往上第一个匹配P_k的点,然后同样倍增(这个倍增是倍增前驱)找出最多能匹配的位置q,若q\le p+1即可。
预处理O(n\log c),O(\log^2 c)每次查询。
A卷 Day2T2 滚榜
先考虑暴力枚举所有排列。我们可以考虑贪心,最小化封榜后过题数t:若t(t\le m)可行,那么一定可以让最后一队再过m-t题,这样仍可行。这样是O(n!n)的
优化也很显然,考虑状压DP。
暴力是,f(S,i,w,sum)表示用了集合S,最后一个是i,i额外过了w题,S额外过题数和为sum.
这样是O(2^nn^2m^2),不太行。
按照套路,w是没用的,我们直接费用提前计算,就是说加入一个j,若j至少要过x题,那么之后共有(n-|S|)个人要因为j再过x题。
这样就是O(2^nn^2m)了,空间O(2^nnm).
实际上,\sum_i\binom{n}{i}i(n-i)=2^{n-2}n(n-1),计算量至多159744000,是合理的
My code
A卷Day2T3 支配
先求支配树DT。
当然可以用polylog的方法,但没必要,枚举删掉点u再从1开始bfs,走不到的就受u支配,这样就能O(n(n+m))求出每个点的支配集;又由于fa_u的受支配集大小恰为u的受支配集大小减1,就可以O(n(n+m))求出DT。
考虑一个点u,DT上父亲为fa,受支配集D_u变化仅当D_{fa}改变或fa不再支配u.这个等价于若fa不再支配u,则u子树中所有点受支配集都改变。
所以只需判断fa是否仍然支配u.
记新加入的边为(x,y),那么fa不再支配当且u仅当原图存在1\rightarrow x和y\rightarrow u的路径且均不经过fa(注意x,y\ne fa)。
存在1\rightarrow x不经过fa显然仅当fa不支配x.考虑预处理f(i,j)表示在不经过fa_i的情况下j能否到达i.那么存在y\rightarrow u仅当f(u,y)=1.直接在反图上从i开始bfs即可预处理好。
询问时候枚举所有u判断即可。
总复杂度O(n(n+m+Q))
可能轻微卡常,但这些技巧显然省选选手都能掌握。
B卷 数对
枚举i的所有倍数的复杂度是O(A/i),去重之后复杂度是O(\sum_i A/i)=O(A\log A).
B卷 取模
我居然这种题都不会了。。。
考虑暴力枚举k. 令b_i=a_i\mod a_k,就是找一对b_i+b_j最大,贡献(b_i+b_j)\mod a_k,或找一对b_i+b_j<a_k,贡献b_i+b_j.将b排序后双指针即可。复杂度O(n^2\log n).
然而只要加上两个优化,当a_k小于当前答案时直接结束,则不同的有效a_k至多O(\log A)个。
证明也很容易:记最终答案为ans.a_k之后两个不同的数为a_{k+1},a_{k+2}
(a_{k+1}+a_{k+2})\mod a_k\le ans\\\\
\Rightarrow a_{k+1}+a_{k+2}-a_k\le ans\\\\
\Rightarrow (a_{k+1}-ans)+(a_{k+2}-ans)\le a_k-ans
所以数列f_i=a_i-ans是至少是斐波那契级别增长,因此不同的有效k至多O(\log A)个。
总时间复杂度O(n\log n\log A)
%%%
NOI加油
Day2T2 的时间复杂度有点问题吧,应该还是 O(2^nn^2m) 的。
\sum_{i=0}^{n} \binom{n}{i}i(n-i)=2^{n-2}(n-1) n
哦是的,吸收一下就行,不过2^{n-2}n(n-1)m\le 159744000 也是合理的