省选模拟49

A. Manager

  首先可以发现每个点的答案最多两种,即原中位数或者排名下一个的数。

  然后可以考虑先求出来每个点的中位数,然后发现一个点的中位数会改变当且仅当修改的点的权值小于等于中位数。

  然后这个东西随便维护一下就行了。

B. GCD再放送

  首先对于$k=1$的情况有显然的容斥,只要计算gcd是$x$的倍数的方案数即可容斥得到恰好的方案。

  然后这个东西可以扩展到正解,同样计算gcd是$x$的倍数的方案数,那么可以按照以下讨论:

  1.当前区间是某个序列的子区间。这个直接利用gcd段数不超过log就可以简单计算。

  2.当前区间是若干个序列拼起来的。

  那么可以发现一个序列要么整段的gcd是$x$的倍数,这些我们单独考虑,其余的都是有一段前缀和后缀是$x$的倍数。

  那么整个区间中间必然都是第一种情况,用组合数可以简单算出方案,然后讨论两端的情况计算方案数即可。

C. dict

  对于字典序的题似乎很多都是直接考虑最低的不同位。

  枚举最低的不同位是哪一位,然后考虑计算方案。

  首先暴力的思路就是枚举这一位上是谁,然后暴力计算方案数。

  考虑方案数实际上就是对于当前已经存在的排名区间的方案数乘起来,而发现每次变化的只有当前考虑的区间,所以每次的方案数就可以$O(1)$计算。

  然后发现每次的贡献总和是一个非常奇怪的式子,于是就可以发现如果改变枚举上界就能$O(1)$计算了。

  然后需要减掉多余的部分,于是可以想到启发式分裂,也就是只计算较小的那一边。

上一篇:Day11_49_HashTable


下一篇:《剑指 offer》 学习49之二叉搜索树的最近公共祖先