CF668 题解

C

可以考虑长度为 (k) 的区间右移一位造成的影响。

所以可以得到 (s_i=s_{i+k}) 这个结论,所以其实只要构造出第一个长度为 (k) 的区间即可。

对于第一个长度为 (k) 的区间上的每一位,判断能填 (0/1) 中的哪些数,如果 (0/1) 中的一个超过了 (frac{k}{2}) 或者存在矛盾就是无解。

D

考虑这个问题在链上的情况,如果说 Alice 追不上 Bob,大概是因为 (db>2 imes da),这样的话 Bob 可以在 Alice 来了之后马上跑路。

如果 (db) 可能会大于 (n-1),只要把 (db)(n-1)(min) 就行了。

对于树上的情况,只需要把 (db) 对树的直径取 (min)

因为 Alice 先手,需要特判 Alice 可以一步追到 Bob 的情况。

E

如果只有一次询问操作,考虑怎么做这个东西。

仔细思考一下,如果一个比较靠后的数当前没有消掉,那么之后一定再也消不掉了。

所以最优策略就是每次取最后一个能消掉的,这里我只会用分块去找到最后一个合法的位置。

对于询问的限制,首先右端点可以直接用数据结构维护,其实左端点只要用类似扫描线的思想也是能做的。

F

如果 (n) 是偶数,可以选择 First 并把 (i)(i+n) 分到一组去。

这样的话得到的结果一定是 (frac{n(n+1)}{2}+kn equiv frac{n}{2} pmod n)

如果 (n) 是奇数,选择 Second。

可以把给出的点对连上边,再把 (i)(i+n) 连上边,这样就可以发现每个点的度数都是 (2),这个图仍然是一个二分图。

所以一定可以取出 (mod n equiv 0,1,2 dots n-1) 中每个数各一次,这个值 (mod n equiv frac{n(n-1)}{2} equiv 0)

可以这个玩意 (mod 2n) 就不一定为 (0) 了,但是可以发现全部数的总和为 (frac{2n(2n+1)}{2} equiv n pmod {2n}),所以只要取反就好了。

G

有点像网络流,而且网格图是二分图然后看起来挺可做的。

然而问题是要么左右能流要么上下能流,一看就不是很好限制。

正解是把网格图的边看成网络流中的点,网格图的边也是一个二分图,限制转化为两种边不能同时选,这个玩意就是个二分图独立集。

所以跑个网络流就行了。

原文地址:https://www.cnblogs.com/skyh/p/13683981.html