CF1973 Codeforces Round 945 (Div. 2) 游记(VP)

省流

慢速三题,表现分 \(1851\),只能说不掉分。

10.20

内含剧透,请vp后再来。

不是题解!!!!!!!

赛时

A 题给出三个人的分数,两两之间进行一些比赛,胜平负获得 \(2/1/0\) 分,问最多能有多少场平局,每人分数不超过 \(30\)。数据范围很小,直接暴力枚举两人之间平局的场次,最后再看剩下所有人的分数是否都为正且是二的倍数。\(5min\) 通过。
B 题给了一个序列,要求给出一个长度 \(k\),对于所有长度为 \(k\) 的子串,算出一个子串里所有数的或的值,所有子串的这个值相等。问这个 \(k\) 最小为多少。由于或运算叠加相同的不会影响最终值,所以当长度 \(k\) 符合条件时,\(i\)\(i + k\) 加上 \(i + 1\)\(i + k + 1\) 等于 \(i\)\(i + k + 1\),将 \(j\) 进行同样操作,可以得到 \(j\)\(j + k + 1\),而长度为 \(k\) 的四段都相等,所以长度为 \(k + 1\) 的段一定也符合条件。可以借助 st 表来理解。
那么具有单调性可以二分,考虑怎么判定。发现或相等的条件是对于二进制的每一位中不为零的数相同,而二进制位出现的个数容易加减维护,那么维护当前长度二进制每一位并与前一段比较就可以检查。复杂度为 \(O(n \log max \log n)\)\(17min\) 通过。
接着看 C 题,题目给了一个长度为 \(4 \leq n \leq 1e4, n \equiv 0 \pmod{2}\) 的排列,要求你给出一个长度同样为 \(n\) 的排列,使这两个排列对应的值相加后,除了头尾,严格大于左右两边的数尽量多。一开始想着贪心或者二分,贪心的话优先把和两边差距较大的数取走,二分就二分总共可能有多少,但都没什么好的想法。
手玩时想到可以先把所有的数都变得相等,然后把其中一些数变大而另一些数变小。然后很顺畅的想到除了 \(1\) 都可以再变大,那么就把和 \(1\) 出现位置同奇偶性的都变小,另外一半都变大就行了。然后就是把较大的数变小的多一些,较小的数变大的多一些就行了。在 \(81min\) 通过。
接着看 D 题。交互题,有一个隐藏的长度为 \(n\) 的数组,和一个数 \(k\)。每次可以询问一个 \((l, x)\),会返回最小的 \(r\) 使 \(l\)\(r\) 的区间最大值乘区间长度为 \(x\),或返回不存在。要求询问 \(2 \times n\) 次,把整个数组分成 \(k\) 段,使每一段内的区间长度乘最大值都相等。想了一会没什么思路,比赛结束。

赛后

先额外看了 B 的题解,发现有更好的做法。把整个序列按位拆分,对于存在 \(1\) 的某一位的最长的连续零一定要小于 \(k\),不然就会出现某一段中该位为 \(0\)。那么所有连续 \(0\) 的最大长度加一就是答案。
这道题原题是要插入至多一个新数,问插入之后 \(k\) 最小为多少。我们利用刚刚的结论,就可以很容易的在 \(O(n)\) 中判断插入一个数能否把所有位大于 \(k\) 的连续零拆掉,所以再二分答案就行了。
D 题设每段的区间长度乘最大值为 \(p\),考虑什么样的 \(p\) 可能被选择。设最大值为 \(maxx\),那么显然 \(p\) 只能是 \(maxx\) 的倍数。而 \(maxx\) 很好求,只需要问从 \(1\)\(n\) 的长度乘最大值时返回的是 \(n\),此时询问的数就是 \(maxx\)。然后考虑 \(p\) 的上界,总值为 \(k \times p\),而每段最大为 \(maxx\),所以总长度一定大于等于 \(\frac{k \times p}{maxx}\),也就是 \(\frac{k \times p}{maxx} \leq n\)。变换后得到 \(p \leq \frac{n * maxx}{k}\),其中又是 \(maxx\) 倍数的就恰好只剩 \(\frac{n}{k}\) 种。每次验证一个 \(p\) 是否正确需要 \(k\) 次遍历,所以现在验证完所有可能恰好用 \(n\) 次。再加上一开始的找 \(maxx\) 次数就被限制在了 \(2 \times n\)
注意这道题要考虑很多种 \(p\) 错误的可能,以及每次输完一个答案后要读入确认答案正确的 \(1\)

2025年10月20日

posted @ 2025-10-20 20:02  vivid_stareium  阅读(4)  评论(0)    收藏  举报