7.7

* 表示看了题解。

CF2123F

首先 \(p_i = i\) 的排列是 good 的。那么就要思考怎么调整。

对于一个数 \(x\),它能调到 \(x\) 的因数或倍数位置上。按照相同的因数分类,如果存在某类只有一个数,那么就无法调整。剩下就只要思考如何调整就行了。不难想到只要把同一类循环位移一位就满足要求了。

CF2118D1 *

看了一点就知道了,对数据范围不够敏感。

因为 \(k\) 很小,所以可以记录下当前处于哪个点,已经花的时间模 k 的余数和方向,然后 bfs 搜一遍就行了。

D2 不会,明天再说。

CF2121F

对于条件一是一个经典问题:枚举右端点 r,统计左端点有多少个 l 满足 \(pre_r - s = pre_{l - 1}\),用 map 统计一下就好了。

但是区间 max 不好处理,因为不具有前缀和一样的性质,但是可以弱化一下这个条件,变成 \(\max([l, r]) \leq x\)。那么就只要在条件一的经典做法上稍作修改:当 \(a_i > x\) 的时候,把 map 清空,因为此时前缀不能贡献答案,剩下同经典做法,最后的答案就相减一下。

CF2121G *

看到把 max 拆掉就知道咋做了,,,

首先 \(\max(x, y)=\frac{x+y+|x-y|}{2}\),那么 \(f([l, r])\) 就是区间长度 + 区间中 0 和 1 个数差的绝对值。这两部分可以分开计算。对于区间长度就枚举区间长度,每种区间长度可以贡献 \(n - i + 1\) 次。

绝对值部分也是一个经典问题:令 0 为 +1,1 为 -1,\(pre_i\) 为前缀和。将 \(pre_i\) 从小到大排序,这样就能去掉绝对值。对于一个 \(pre_i\),它取正号时贡献 \(i\) 次,取负号时贡献 \(n - i\) 次。

CF2117G

大胆猜测,边取尽量小的时候答案更优,因为对于一个小边和大边,先插小边不会使答案更劣,先插大边可能会漏掉更优的解。

那么就是类似于最小生成树,维护 1 和 n 的连通性,当 1 和 n 连通时更新答案。

posted @ 2025-07-07 23:30  Nylch  阅读(12)  评论(0)    收藏  举报