妙妙脑筋急转弯,会切橙题就能做!
ABC305F
直接 dfs + 回溯一定不会让一个点被遍历超过 次,于是直接 dfs 就做完了。
CF1658C
首先转化题意, 相当于把第 个元素右边的所有元素全扔到最前面所形成的排列的价值,此时排列开头的元素为 ( 例外,它是原排列)。于是发现当且仅当排列以 开头的时候才有 ,这题就已经做完一半了。
然后考虑以 这个排列为基础,一个一个把最右边的元素扔回第一个,发现这个过程中价值要么减少要么至多增加 。于是这题就做完了。
如何证明价值无论减少多少都能构造出一个排列?发现当前排列里元素到底是多少并不重要,只需要在乎相对大小即可,故你往前扔的时候想吞掉前面几个元素都可以。
CF1905C
这个题比较考验注意力和手玩能力,你需要注意到我们实际上一直只是在对字符串字典序最大的一个子序列进行右移,然后你找出这个子序列,把它反转再放回去,再检查得到的字符串是不是排好序的即可。
CF1956C
发现构造一个从左上角一圈一圈往外递增的矩阵是最优的。
但这个题我说实话真的不会证,还是太困难了,证明直接看题解区吧。
AGC007B
先构造递增的 和递减的 ,让 全部都相同并让公差尽量大,然后再根据他给的条件进行调整即可,因为值域十分宽裕,所以你后来做的调整是不会超出一开始留的余量的。
AGC008D
先把被钦定了的位置都填进去,然后贪心地尽量先填 小的数,如果填不上就输出无解,最后再把空着的位置补上即可。这个题我也不会证。
ARC118C
这个题比较难绷,发现 这三个数完美符合条件,于是直接搞 个这三个数的倍数输出即可。反正我当时没自己做出来。
CF1968F
发现只可能分成两个或者三个异或和相等的区间,因为超过三个的情况可以找三个相邻的区间合并成一个。
两个区间的情况,整个区间的异或和一定为 ,是充要条件。
三个区间的情况,设 ,设前两个区间的右端点为 ,则三段的异或和分别是 。因为三段值相等,所以化简一下可得 。
于是先把 离散化一下,把每个值出现的位置都扔到一个 vector 里,再二分 在 内第一次出现的位置和 在 内最后一次出现的位置就做完了。
CF1658F
Codeforces Constructive Round Div.2 F。
首先我没做出来,还是菜。其次这真的不是 *1500?感觉放 C 比较合理。
设需要 个 ,先特判掉除不尽导致 是小数的情况。
然后智慧的结论就来了:直接把 01 串复制一份接在后面,则在新的长度为 的串上一定有一个长度为 的子区间正好有 个 。
证明:把子区间往右移一位,子区间里 的个数要么不变,要么只会增加或减少一个 。于是无解的情况只可能是所有子区间里的 都太少。可 的值本来就是原串里 的密度,如果所有子区间里都缺 那原串里就不可能有那么多个 。
于是求一下前缀和,遍历到 时只用划分成一个子区间, 时可以划分成 两个子区间。
不愧是出题人难度评价从 A~F 反复横跳过一遍的题。
CF1658E
Codeforces Constructive Round Div.2 E。
首先我做出来了。其次我感觉这题比 F 难点,但还是放 D 更合适。
手玩一下可以发现,如果有一个人到了 所在的位置,那他直接就稳赢了。由于两个人都按最优策略行动,这个条件等同于起始点离 的曼哈顿距离 时,后手必胜,起始点正好是 时,先手必胜。
当起始点离 的曼哈顿距离 时,无论是谁都不应该走到离 比 远的地方,否则对面可以直接走到 获胜,所以两个人争夺的位置就从 变成了离 曼哈顿距离 的位置中价值最大的。于是直接把前面 的性质推广到当前最大的位置,递归下去即可。到这里这题的解法就完全清楚了,但直接朴素做是 的,考虑优化。
距离一个点曼哈顿距离 的点分布形如一个菱形,每次排除后手必胜的点等同于排除菱形外面的点。这里放张图方便理解:
发现图中蓝色的直线可以表示为 的形式,红色的直线可以表示为 的形式。于是我们要做的就是每次找出当前价值最大的点 ,然后排除掉所有不满足 和 的点。
实现上,直接维护 和 的上界、下界,把矩阵里的所有值和它的位置都扔到大根堆里,每次取出堆顶,如果位置满足限制就更新边界,该位置的答案为先手必胜;否则把答案设为后手必胜。
ARC176A
都是矩阵,感觉这个题真的比上面那个题难好多啊,这玩意真的只有绿?
还没做,做完来补。
P10678
唯一真神,猜结论难度极低,证明难度不知道,反正我到现在都没怎么看懂题解。
贪心地思考,度数大的点放在深度浅的地方一定最优,于是直接 bfs。
证明:交上去过了。 如你所见,这个题我也不会证。