题解 Codeforces Round #668 (Div. 1) (CF1404)

A Balanced Bitstring

如果合法应该满足\(\forall i,s_i=s_{i+k}\),从前往后扫一遍把'?'变成这个位置的相应字符,再从后往前扫一遍做同样的操作。如果有冲突或者某一个长度为\(k\)的子段里\(0\)的个数\(>\frac{k}{2}\)或者\(1\)的个数\(>\frac{k}{2}\)就不合法,否则合法。

B Tree Tag

如果\(a\)\(\leq da\)步走到\(b\)肯定是\(\text{Alice}\)赢,否则考虑树上某个点可以走\(\leq da\)步到达所有点,这个点肯定在最长链上,所以只要最长链长度\(\leq 2*da\)那么\(\text{Alice}\)也能赢。但这样交上去会\(WA\),发现如果这两种情况都不满足但是\(db \leq 2*da\)那么\(\text{Alice}\)还是能赢。这三种情况都不满足就是\(\text{Bob}\)赢。

C Fixed Point Removal

发现前面的点对后面有影响,所以考虑按照右端点排序,把右边的一个个往里面加。如果\(a_i=i\)可以直接删除,那就把\(\geq a_i\)的位置都\(+1\)。如果\(a_i>i\)则永远不能满足,如果\(a_i \leq i\)那么前面必须删掉至少\(i-a_i\)个这个才能删掉。由于前面删掉的数是单调不减的,考虑二分一个位置\(pos\),从\(pos\)删到\(i\)可以删至少\(i-a_i\)个,那么就把\(\geq pos\)的位置贡献\(+1\),表示从\(pos\)开始往后删最多可以删掉这么多。每次处理完\(i\)之后把右端点\(=i\)的询问的左端点查一下,相当于直接查这个询问\([l,r]\)的答案。

D Game of Pairs

我们发现总和\(sum=1+2+\dots+2n=n(2n+1)\),注意到\((2n+1,2n)=1,(n,2n+1)=n\),所以\(sum \equiv n \pmod {2n}\)。假设\(\text{Second}\)可以选出恰好\(n\)个数使得他们的总和\(s\)\(n\)的倍数,那么\(s \equiv 0 \pmod {2n}\)或者\(s \equiv n \pmod {2n}\)。如果是第一种情况那么\(\text{Second}\)必胜,否则他可以选择剩下的数,因为剩下的数\(\mod 2n\)肯定是\(0\)。所以如果\(\text{First}\)必胜他就要想办法让\(\text{Second}\)选不出来总和为\(n\)的倍数的一些数。

考虑\(n=2m\),那么\(\text{First}\)必胜,因为我们可以把\(2n\)个数\(1,2 \dots 2n\)按照\(\mod n\)的余数分类,这样\((1,n+1),(2,n+2) \dots (n,2n)\)一定会被两两分成一组,那么\(\text{Second}\)在每一组不管选哪一个数\(\mod n\)的余数总是相同的,于是总和一定\(\equiv \frac{n(n-1)}{2}\)。将\(n=2m\)代入,原式\(=m(2m-1)\)。由于\((2m-1,2m)=1,(m,2m)=m\),所以余数一定是\(m=\frac{2n}{4}\),肯定不是\(2n\)的倍数。

然后考虑\(n=2m+1\),这时候\(\text{Second}\)必胜,因为我们就算选出了\(n=2m\)时候的必败状态算出来的答案仍旧是\(n\)的倍数,所以\(n=2m+1\)\(\text{Second}\)必胜。我们发现这个必败状态非常好选,因为我们让每个余数只出现一次就相当于限制余数相同的两个数不一起选,再加上同一组只能选一个,所以我们把每个数看成一个点,把和这个数在同一组的、和这个数余数相同的数都和它连边,再进行黑白染色,这样就保证相邻的点不同时选中。我们发现一共\(2n\)个点\(2n\)条边,所以总能选出来恰好\(n\)个颜色相同的点使得他们的总和是\(n\)的倍数。

E Bricks

考虑只有一个区域不包含"L"形时,它才是一块完整的砖,否则要用两块拼起来。考虑如果删掉两个黑点可以形成"L"形,我们就在这两个点之间连边,那么黑点总数\(-\)最大独立集的大小就是最少需要的砖块数。由于我们把横着的和竖着的连边,实际上这是一个二分图,可以直接用匈牙利算法算出最大匹配,那么答案就是总点数\(-\)(二分图中的点数\(-\)二分图最大匹配),可以用自己喜欢的方法求最大匹配。

posted @ 2020-09-07 21:39  kylin_xy  阅读(351)  评论(0编辑  收藏  举报