CodeChef May Challenge 2020 简要题解

因为之前没打过只能打 d i v 2 div2 div2
感觉题还不错的样子

Coronavirus Spread

Isolation Centers

Sorting Vases

先对非二元环做,然后将二元环两两合并

code

Chef and Bitwise Product

比较脑残的做法
从高往低枚举
考虑对于一个可以 0 / 1 0/1 0/1任意选的地方
0 0 0后面显然在满足下界情况直接贪心
然后选 1 1 1继续即可
注意特判 L , R L,R L,R
直接做是两个 l o g log log,但实际上想想感觉似乎可以一个 l o g log log
假装他可以

code

Triple Sort

显然是先二操作缩成连通块
变成求最大化边的环覆盖的环数
直接找每个简单环显然是错的
直接状压 d p dp dp枚举子集即可

但做的时候傻逼的没意识到为什么是错的
比如这个图
( 1 , 2 ) ( 2 , 3 ) ( 3 , 1 ) ( 1 , 4 ) , ( 4 , 1 ) ( 3 , 5 ) ( 5 , 3 ) ( 4 , 5 ) , ( 5 , 6 ) , ( 6 , 4 ) (1,2)(2,3)(3,1)(1,4),(4,1)(3,5)(5,3)(4,5),(5,6),(6,4) (1,2)(2,3)(3,1)(1,4),(4,1)(3,5)(5,3)(4,5),(5,6),(6,4)
于是在 x d l xdl xdl的建议下写了个随机化乱搞
然后它过了

code

Buying a New String

显然是 A A A一段前缀和 B B B一段后缀
可以直接枚举,然后在 A c Ac Ac自动机上计算贡献
唯一需要考虑的就是拼接的 25 ∗ 2 25*2 252长度的贡献
就是 A ′ B ′ − A ′ − B ′ A'B'-A'-B' ABAB即可
复杂度 O ( 25 ∣ A ∣ ∣ B ∣ ) O(25|A||B|) O(25AB)

code

下面做法经 f s y fsy fsy教育/kk
正反串各建一个自动机
考虑一个 A A A的前缀,预处理整串的贡献
考虑散串,在 A c Ac Ac自动机 f a i l fail fail树上 d f s dfs dfs
长度为 k k k的位置对应反串的 s − k s-k sk的位置
子树加,每次就是在反串自动机上询问 m a x max max

Binary Land

显然的想法是矩乘
考虑维护两个栈,分别记录某一段前缀的后缀积和后缀的前缀积
每次弹出在第一个栈内弹出即可,加入在第二个内加入
第一个栈空了后把第二个丢过来即可
由于加入的矩阵每行只有三个可以做到 O ( n 2 ) O(n^2) O(n2)乘法
询问由于最初是向量也是 O ( n 2 ) O(n^2) O(n2)

总复杂度 O ( Q n 2 ) O(Qn^2) O(Qn2)
由于咕咕咕并没有写代码

Not a Real World Problem

考虑先让贡献全部为正
建立最小割模型, s , t s,t s,t分别表示 1 , − 1 1,-1 1,1
割哪边的就代表取哪个,边对应的流量可以简单计算
然后相邻之间连边即可

注意输出方案

code

Chef and Rainbow Road

又是被 x d l xdl xdl教育的一道题/kk
先将答案乘上 ∏ i a i \prod_ia_i iai
考虑对于 m ≤ 1 e 5 m\le 1e5 m1e5直接对每列构造生成函数 f t ( x ) = ∑ i a t i x i = 1 1 − a t x f_t(x)=\sum_ia_t^ix^i=\frac{1}{1-a_tx} ft(x)=iatixi=1atx1
然后乘起来即可
现在考虑 m ≤ 1 e 18 m\le1e18 m1e18怎么做
本身要求的是 [ x k − 1 ] ∏ t 1 1 − a t x [x^{k-1}]\prod_{t}\frac{1}{1-a_tx} [xk1]t1atx1
考虑找到数 c [ ] c[] c[],满足 ∏ t 1 1 − a t x = ∑ t c t 1 − a t x \prod_{t}\frac{1}{1-a_tx}=\sum_{t}\frac{c_t}{1-a_tx} t1atx1=t1atxct
即满足 P ( x ) = ∑ i c i ∏ j ≠ i ( 1 − a j x ) = 1 P(x)=\sum_{i}c_i\prod_{j\not=i}({1-a_jx})=1 P(x)=icij=i(1ajx)=1
由于 P ( x ) P(x) P(x) x x x取值无关,考虑带入 x = 1 a i x=\frac{1}{a_i} x=ai1
P ( 1 a i ) = c i ∏ j ≠ i ( 1 − a j a i ) = 1 P(\frac{1}{a_i})=c_i\prod_{j\not=i}(1-\frac{a_j}{a_i})=1 P(ai1)=cij=i(1aiaj)=1
于是只需要对 g i ( x ) = ∏ j ( 1 − a j x ) 1 − a i x g_i(x)=\frac{\prod_j(1-a_jx)}{1-a_ix} gi(x)=1aixj(1ajx)求值即可
用洛必达法则后直接对上面东西求导后的函数多点求值即可

code

你可能感兴趣的:(CodeChef May Challenge 2020 简要题解)