1.cf C. Bouncing Ball
https://codeforces.com/contest/1457/problem/C
大意:有一个01字符串,1代表可走,0代表不可走。给出从第几个开始,然后每步+k,每次可以进行两个操作,将0变成1花费x,把第一个字符删除花费y,当然删除之后编号也会改变。
第一行输入n,p,k,(1<=p<=n<=1e5,1<=k<=n)代表字符串的长度,从第几个开始走,每次走的间隔。
接下来一行输入01字符串,接下来一行输入x,y代表操作1,2花费的价值。求最小价值。
思路:首先一步一步来,还是先想最后一步,仔细想想就会发现,跳出去之前的那一步无非是从n-k+1~n这几个可能,那么上一步呢?很容易想到,-k或者直接把上一步的点作为第p个,把之前的删除。所以答案就出来了,遍历n-k+1,n的点,然后往前一次-k,每次都计算下把前面删除的总花费,维护最小值。注意当j<=p结束第二层循环。
总结:还是利用逆向思维,先想最后的状态是什么?然后思考最后一步怎么来的。
2.D. XOR-gun
https://codeforces.com/contest/1457/problem/D
大意:给定一个长度为n的非严格单调递增的序列,(2<=n<=1e5),每次选择两个相邻的数,用它们的异或值代替这两个数,求破坏递增性的最小操作步数。
思路:这题真的巧妙啊,首先对于连续三个数,二进制位最高位相等,那么必定可以通过操作一步从而满足题意(即选择靠后的两个数,因为最高位异或变成了0,所以必定小于前面的那个),注意到a[i]最大是1e9,也就是说,二进制最多有31为,因为是有序的序列,最坏情况下是每连续两个数的最高二进制位数相同,这时候n最多64个,所以当n>64时,必定会出现连续三个数的最高二进制位数是一样的,直接输出1,当n<=64时,直接暴力枚举就行了。如果能通过一定操作,符合题意那么对于出现a[i]>a[i+1]的这两个值,一定是连续的某个区间来的,所以枚举区间,每个区间三种情况,该区间完全异或和a[l-1]比,和a[r+1]比,该区间前后某两段异或后比。