2021 省选模拟总结
2021.2.20
T1. 人生如一叶
题目要求最大团,而最大团 = 补图的最大独立集。考虑原图的补图,可以发现其有优美的性质——补图是一张二分图。
二分图的最大独立集 = 点数 - 最大二分匹配 × 2,匈牙利 / 网络流求最大二分匹配即可。
2021.3.29
T1. 要换换名字(name)
可以发现,当一个字符串有不少于 m 个不同的子序列时,其一定有解。
所以对于每个字符串,只需要找出前 n 小的子序列,设 Nexti,c 表示第 i 位后第一个字符 c 的位置,BFS 找子序列,由于不同字符串之间可能有相同子序列,所以需要 trie 或 hash 判重。
每个字符串向子序列连边,发现是一张二分图,二分 + 匈牙利找最大匹配即可。
T3. 获取名额(orz)
最终答案显然为 1−∏ri=l(1−aix)。
当 ai/x 比较大(即 1−ai/x 较小)时,∏1−ai/x 收敛得会很快(0.520<10−6),当其小于 10−6 时就可以直接输出了。
但是当 ai/x 比较小精度就过不去了,有 ∏1−ai/x=exp(∑ln(1−ai/x))。
又知道 ln(1+x) 的泰勒展开 ∑∞n=0n+1(−1)nxn+1。
所以我们可以设定阈值 L=0.5,每次询问将区间中的数分为两部分,由以上分析可知第一部分的数大概在 25 左右;对于第二部分,可以分别预处理出泰勒展开的前 25 项的前缀和。最后答案为 1 - 两部分的贡献相乘。
注意 x>max(ai),所以可以将 x 代换为 x/max(ai),ai 代换为 ai/max(ai) 以避免高精。
2021.3.30
T1. 神奇纸牌(uno)
对于每一张纸牌有 24 种颜色存在状态,所以我们可以 224 枚举所有点数的颜色存在状态并,并查集判断并的合法性,注意!一个并合法当且仅当 并中出现的颜色 全部联通。
那么问题就转化为了有 n 个带标号的球和 m 个带标号的盒子,要求每个盒子非空的方案数,
简单容斥可以得出方案数为 ∑mi=0(−1)m−iin(mi)。
T3. 打扫笛卡尔(cartesian)
考虑递推,设 fi 为序列长度为 i 的期望舒适度的和,gi 为序列长度为 i 时期望打扫得到的树的大小之和。
易得:
fi=gi+i−1∑j=0(i−1j)12(fj⋅(i−j−1)!+fi−j−1⋅j!)
简单转换可得:
fi=gi+i−1∑j=0(i−1)!j!(i−j−1)!fj⋅(i−j−1)!=gi+i−1∑j=0(i−1)!j!fj
类似地可以得到:gi=i!+∑i−1j=0(i−1)!jgj。
f 和 g 显然可以 O(n) 递推,时间复杂度 O(n)。
2021.4.1
T1. 异或(inception)
令二进制下 x 的最高位为 k,将消去最低 k 位后相同的 ai 归为一组。
可以发现,一组内的选择方案只可能是 0, 1, 2,0, 1 的方案数显然,2 的方案数可以用 trie 简单求出。组与组之间的方案数直接相乘。
T2. 计数(interwoven)
等价地求小于等于 x 方案数,令 fi 为到第 i 位地方案数,转移简单:fi=kfi−1−(k−1)fi−x。
可以发现转移式等价于:一张 N 个点的图,i 到 i+1 有 a 条边,i 到 i+x 有 b 条边,求 1 到 N 的方案数,这个问题可以枚举 b 的个数计算:
N/x∑i=0(i+N−ix−1i)biaN−ix−1
而代回原问题可得:
fi=gi−gi−xgi=n/i∑j=0(j+i−jx−1j)(1−k)jki−jx−1
O(ni) 预处理 fi,总时间复杂度 O(nlogn)。
2021.4.2
T1. 盗梦空间(inception)
首先以题目所给的 K 个点为关键点建出虚树,分情况计算 u 点:
-
u 在虚树的点上,令 fi 表示据 i 最近的关键点的距离,简单树形 dp 计算。
-
u 在虚树边上的某一点,对于长为 len 的边 (x,y),答案显然为 ⌊fx+fy+len2⌋。但是当 |x−y|≥len 时需要特判。
-
u 在虚树边上的某一点延伸出的子树的深度最大的点上(不包括端点),对于边 (x,y),找出边上的分界点 z 使得 z 一下的点离 fy 更近,z 以上的点离 fx 更近。
对于 z 以上的点,贡献为 fx+depmax−depu,depmax 表示 z 以上子树中最大深度,倍增维护。
对于 z 一下的点,贡献为 fy+depy+depmax−2depv,其中 v 为 z 一下子树深度最大的点,depmax 为其子树最大深度,同样可以倍增维护。
-
u 在虚树某一点延伸出子树中深度最大的点,其实与 3 本质相同,但是为了方便计算所以分开了。
将每个点的儿子提前按最大深度排序,每次遍历儿子找到第一个不在虚树或虚树的边上的儿子,这样每次询问遍历的点不会超过 K,从而保证的时间复杂度的正确。贡献为 fx+depmax−depx。
最后还需要注意一些细节。
T2. 爱乐之城(lalaland)
令 g(n)=∑ni=1i∑nj=1[i⊥j]k,f(n)=∑ni=1∑nj=1μ(ij),然后大力推式:
g(n)=2(n∑i=2ii∑j=1[i⊥j]j)+1g(n)=2(n∑i=2iφ(i)i2)+1g(n)=n∑i=1i2φ(i)
由此我们可以 O(n) 预处理出 g(n)。然后对 f(n) 大力推式:
f(n)=n∑i=1n∑j=1[i⊥j]μ(ij)f(n)=n∑i=1n∑j=1μ(i)μ(j)∑d|(i,j)μ(d)f(n)=n∑d=1μ(d)∑d|iμ(i)∑d|jμ(j)f(n)=n∑d=1μ(d)(∑d|iμ(i))2
可以发现, n 只会影响 d|n 的项,所以可以增量求解,时间复杂度调和级数。
最后考虑答案 F(S)=∑T∈Sf(gcd(a∈T))∏a∈Tg(a),构造函数 h(d) 使得 f(n)=∑d|nh(d),代入得:
F(S)=∑T∈S(∑d|gcd(T)h(d))∏ai∈Tg(ai)F(S)=m∑d=1d∏d|ai(g(ai)+1)
可以发现 S 中每加入一个 ai,只会影响约束个数个 d,由于保证 ai 互不相同,复杂度依旧是调和计数。
2021.4.5
T1. 悄悄话(word)
考虑从后往前做,令 fi 表示最后一句话是 i 串的最大权值和。
将所有串拼接并求出 sa,可以发现包括整个串 i 的后缀构成一个区间,st 表 + 二分可以 O(logn) 找出区间。
区间求 max 线段树维护即可,每求出 fi,遍历其所有后缀更新线段树上节点。
总时间复杂度 O(∑|si|log(∑|si|))。
2021.4.7
T1. 染色(coloring)
设第 i 条横线包括的横线范围为 [li,ri],可以发现排序后 li, ri 都是单调不下降的。
考虑先染斜线,为了不算重,保证每一条不染的斜线都没有被染的横线 完全包含。考虑 dp,设 fi,j 为第 i 条斜线必选且 [ri−j+1,j] 的横线都被染的方案数,同时令 gi=∑fi,j
枚举上一条染的斜线 k,分情况讨论:
-
rk<li,此时需要保证 [ri−j+1,j] 被染,ri−j 不染,[li,ri−j−1] 可染可不染,斜线 k 染色状态不会对 i 造成影响,所以总的贡献为 2ri−li−jgk。
-
ri−j>rk,同上需保证 [ri−j+1,j] 被染且 ri−j 不染,但是可选择横线区间变为 [rk+1,ri−j−1],斜向 k 的染色状态同样无影响,总贡献为 2ri−rk−j−1gk。
-
ri−j<=rk,此时斜线 k 后 rk−ri+j 位必染,且 rk−ri+j−1 位不染,总贡献为 fk,rk−ri+j。
最终答案为 ∑gi。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步