杂题题解
A - I hate 1
要求两两之间互相除的余数不为\(1\),\(N=1\)的时,直接\(1\)就好。考虑\(2 \leq N\)的情况,\(1\)一定是不选的,\(n\)和\(n+1\)也不能同时存在,所以只能在纯奇数和纯偶数之间选择,偶数显然更优,因为无论怎么取数余数一定都会是\(2\)的倍数,奇数则不然,以\(3,7\)为例。所以取纯偶数即可,最优解为\(n/2\),全部取偶数。
LG P13565 「CZOI-R5」按位或
本题采用贪心,容易发现,优先让高位的1变成0是更好的,因为 $ \sum_{i=1}^{k-1} 2^i < 2^k $。我们从最高位开始往下枚举,尝试能否让当前位变为0,要求所有的书这一位都变成0,高妙之处在于无后效性的处理,我们记录下处理过的位的贡献,然后为了满足之前的最优解,所以在后面处理 $ a_i $ 的时候,都会先调整至之前处理的状态。
LG P13595 『GTOI - 1B』筝
题意为,选择若干个点,连成线段,花费为 $ |(a[x]-a[y])| $,使得所有的点都被覆盖。
性质如下:每一次操作,选择的两个点 $ |(a[x]-a[y])| $ 应当为1,如果选择了 $ |(a[x]-a[y])| >1 $,不妨先把 $ a[x] $ 变成 $ a[y]-1 $,这一步中贡献>=0,在把 $ a[y]-1 变为 a[y] $,那么相同的贡献下,情况不会更坏。?抽象的证明
问题转化为用若干(x,x+1)相连的线段,覆盖整个区间,要求线段数目。
我们只需从左往右扫,记录下每一个点能够更新的最远的位置,和已经更新的最远位置,碰到已经更新的最远位置就ans++,然后把更新的最远位置换成能够更新的最远位置即可。
D. Binary String Battle
先特判下先手一步获胜的情况,cnt1<=k即可。然后进入拉扯状态,考虑怎样才会进入循环。发现先手的贡献始终会是k,而后手则不一定,需要有连续k个0的时候,后手的贡献才会为K,能够抵消掉先手的贡献。下面就是赛时卡住的地方,应该不管怎么样,一定数量的零一定会连续。那么就好办了,我们可以直接把序列分成前一半和后一半,如果各自的长度都大于等于k,则不重叠,后手就可以每次分别取两端长为k的序列,那么先手永远无法抵消。