CodeChef May Challenge 2020 简要题解

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

Coronavirus Spread

Isolation Centers

Sorting Vases

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

code

Chef and Bitwise Product

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

code

Triple Sort

显然是先二操作缩成连通块
变成求最大化边的环覆盖的环数
直接找每个简单环显然是错的
直接状压 d p 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)
于是在 x d l xdl 的建议下写了个随机化乱搞
然后它过了

code

Buying a New String

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

code

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

Binary Land

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

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

Not a Real World Problem

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

注意输出方案

code

Chef and Rainbow Road

又是被 x d l xdl 教育的一道题/kk
先将答案乘上 i a i \prod_ia_i
考虑对于 m 1 e 5 m\le 1e5 直接对每列构造生成函数 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}
然后乘起来即可
现在考虑 m 1 e 18 m\le1e18 怎么做
本身要求的是 [ x k 1 ] t 1 1 a t x [x^{k-1}]\prod_{t}\frac{1}{1-a_tx}
考虑找到数 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}
即满足 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 ) P(x) x x 取值无关,考虑带入 x = 1 a i x=\frac{1}{a_i}
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
于是只需要对 g i ( x ) = j ( 1 a j x ) 1 a i x g_i(x)=\frac{\prod_j(1-a_jx)}{1-a_ix} 求值即可
用洛必达法则后直接对上面东西求导后的函数多点求值即可

code

猜你喜欢

转载自blog.csdn.net/qq_42555009/article/details/105984731