CF Round970 D3 A-G

  • 这场更像是D4,所以明天之前会把 G、H 补上。

A

  • 答案完全取决于 a 和 b 的奇偶性,做个特判就好。

B

  • 开始读题没有注意到那个 square,多费了一些功夫。可以在确定 n 是平方数后构造出对应的字符串,然后与给定的字符串比较即可,因为一旦 n 确定,合法的字符串就是唯一的。

C

  • 注意到当 l 和 r 为最大值时对应的答案也才到 4e4,这启发我们可以直接进行暴力求解,从 l 开始,每次将 d 加一即可。

D

  • 感觉 D 要比 E 和 F 更有学习意义,我们发现每次执行i = p[i]这个操作,假使我们将 1 到 n 看作一系列节点,那么 i 与 p[i] 之间就有连边,此时发现整张图其实是由一些环组成的(包括自环),我们只需要对所有点进行遍历,如果它没在某个环中(也就是fa[i] == i),就进入 dfs 找环(这其中有记忆化的思想),环的根就是入口节点。当我们把所有环找出来之后,每个节点最多能到的黑色整数个数就是它所在环的黑色整数个数。

E

  • 难点其实在于删数的部分,删完之后的计算非常简单。我们可以开一个前缀和数组,用来记录每个字母出现的次数。之后直接对整个数组进行遍历,算出删掉当前字母后的最终答案,最后对这个最终答案取最值就可以。

F

  • 看完样例后就能做出来了,只能说样例解释真是个好东西,读题难度远大于做题,不过开始好像取模有点问题,交了几个 wa 之后开了 int128 才过。

G

  • 开局走对方向很简单,这题学过裴蜀定理的应该都会做,去想什么二分会使做法变得困难。显然从题目中“可以进行 a[i] + a[j]a[i] - a[j] 的操作”这个条件中可以得到,令 a 数组的 gcd 为 g,那么我们可以得到的最好的数组会形如 0, g, 2g, 3g...。本题对空间进行了限制,使得无法通过开 map 的方法解决 mexk 问题,但是仔细思考一下可以发现当我们得到前文所述的数组后,可以通过 O(1) 的方式将答案直接算出来。

H

  • 此题的思路还可以,想到调和级数基本就可以将本题想出来。
  • 用一种桶状前缀和来存储所有数的出现次数,此时 cnt[i] 表示小于等于 i 的数字在数组中出现的个数
  • 之后二分答案,在 check 函数中的每一次 i += x 的操作中判断这一段中取余 x 后小于等于 mid 的数有多少。
  • 需要注意的是我们在二分时只能在 res >= pos\\pos为中位数位置 时返回 true,原因和之前博客中二分求第 k 小的 a[i] 时必须 sum >= k的原因是一致的,当我们按值二分时,一般会按照数量进行分类,当我们所求的 k 并不确切是给定数组 a 中一个小于等于某 a[i] 的数的数量时(也就是所求答案值出现不止一次时),我们按照小于 k 和 大于 k 将整个 [min_of_a, max_of_a] 区间分为两部分,此时右区间的左端点符合题意,而左区间的右端点不符合题意。
  • 还有一点是,由于某个大数可能会被查询很多次,为了减小常数,我们可以离线处理 x 从 1 到 n 的结果,这样就能做到 O(1) 查询了(亲测不离线会 t)。

posted on 2024-09-03 14:07  wuhu12345  阅读(26)  评论(0)    收藏  举报

导航