省选模拟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数组的差分与当前物品价值的大小关系,所以可以考虑用平衡树维护差分序列,在平衡树上二分就可以得到这个最优位置,那么只需要支持在原序列中插入一个数,区间加法即可。

猜你喜欢

转载自www.cnblogs.com/hzoi-cbx/p/12199463.html