省选模拟7
A. 翻转硬币
原题,但是思路很好。
看到这种区间修改的操作可以想一想差分,将原序列差分之后我们得到了不超过2k个位置,那么就下来的问题是:给定若干操作,每种操作可以将两个距离为$a[i]$的点同时取反,求将整个序列变成0的最小操作次数。
发现每个操作只会将两个位置同时取反,可以用bfs求出来任意将两个点同时取反且不改变其他点状态的最少步数,之后状压将这2k个点配对即可。发现每个点必然都会被合并,所以每次转移只要枚举未被选择的最小的点即可。
B. 回文子串
考场被我用$O(nq)$暴力水过去了。大约是暴力处理出来任意一个位置的回文半径,之后暴力扫询问区间统计答案。发现这个东西可以很容易的用线段树优化为区间赋值,单点查询某个位置的字母,区间查询一段区间的和,然而没打。
C. 最大价值
一个结论:选k个物品的最优方案必然包括选$k-1$个方案中的所有物品。
可以有一个简单的$O(n^2)$暴力:按照a排序后,$f_{i,j}$表示前i个物品中选出j个的方案数,那么$f_{i,j}=max(f_{i-1,j-1}+a_{i}*(j-1)+b_{i},f_{i-1,j})$。
根据上面那个结论,必然存在一个位置j使得这个j之前dp转移取后一半,之后取前一半。
发现这个位置对应着dp数组的差分与当前物品价值的大小关系,所以可以考虑用平衡树维护差分序列,在平衡树上二分就可以得到这个最优位置,那么只需要支持在原序列中插入一个数,区间加法即可。