CF1415D XOR-gun

给你一个不降的序列,每次可以把两个相邻的数替换成它们的异或结果,问你破坏序列不降最少的操作次数。

这题 n ≤ 1 0 5 n\leq 10^5 n105 包括 最少 的限制都是来吓唬你的。

那么一个区间经过若干次操作后就变成了区间的异或和。

所以我们想到 o(n^3) 的暴力枚举:

请添加图片描述

但是这个复杂度不合理啊,我们可以想到如果三个相邻的数的最高位相同,那么对后两个数操作一次就可以把最高位抵消掉,这样只操作一次必然最优。

简单计算可得序列长度不能超过 30 ∗ 3 = 90 30*3=90 303=90 也就是说 n ≥ 100 n\geq 100 n100 直接输出 1 1 1 即可。

总结一下的话,这道题的操作没有什么显然的规律性,所以我们考察一些特定情况对它作一些限制,就会得到复杂度比较低的算法。

再举一例:CF1198C Matching vs Independent Set

这题评分不高但是对构造题理解不深的童鞋难度较大。

首先边和点的规模就决定了大多数图论算法都过不去。

如果你能想到去找一个极大的边独立集的话问题就迎刃而解了。

现在我们有大小为 2 k 2k 2k 的边独立集和 3 n − 2 k 3n-2k 3n2k 的点独立集(其定义是两两之间无边相连),必有一个可以满足条件。

posted @ 2022-05-20 09:21  仰望星空的蚂蚁  阅读(17)  评论(0)    收藏  举报  来源