【251121】CF2171 Div.3 vp 总结

老师说让我尝试体验快乐 AK,但是我失败了。

还是太菜了喵!

题目梗概

题目编号 题目名称 题目链接
A Shizuku Hoshikawa and Farm Legs Link
B Yuu Koito and Minimum Absolute Sum Link
C1 / C2 Renako Amaori and XOR Game (easy / hard version) Link / Link
D Rae Taylor and Trees (easy version) Link
E Anisphia Wynn Palettia and Good Permutations Link
F Rae Taylor and Trees (hard version) Link
G Sakura Adachi and Optimal Sequences Link
H Shiori Miyagi and Maximum Array Score Link

给的都是 VJ 的链接,带翻译。

赛时情况

也是被吓到了好吧,和 Div.1+2 的题量差不多,现在 Div.3 都这么强势了吗?

首先读题。A 一眼纯暴力,B 不会但好像是把 \(-1\) 都改成 \(0\),后面的题都没啥思路。C 怎么还带分 easy / hard version 的?坏。

秒 A。看 B。根据样例推翻自己“把 \(-1\) 都改成 \(0\)”的猜测,然后虚空思考。无效。又读了一遍题。我【】题读错了!对对就是 \(a_1\)\(a_n\) 尽可能相等就对了。

推 C。准确来说是推 C1。推出来了开写,倒序判断。然后推 C2。咦咦咦我会了!虽然很感性证明不了,但是不想管了。开写开写。

搞定!做 D 做 D。推了大半天,噢,我会了!光速开码。码完后写错了一些,改改改。改改改。改对了。

由于 F 是 D 的加强版决定先想 F。思考。思考。思考。咋构造啊到底?思考失败,选择开 E。

这 E 是什么【】构造。推推推。推推推。找规律这一块……推了一个神神秘秘的 \(12\) 个数为周期的,额,规律数组,摇了摇发现,嗯,没多少问题,开写。

写完了,F G H 随机看题,还是决定想 F。

终于构造出来了!开写开写。时间不多了啊啊啊。码码码,码完了哦我码完了,样例过了噢耶!

噢耶你个死鬼头,离 AK 还有两题呢大哥。给我想。想。再想。H 会平方 DP 但是之后就不会做了。G 是毫无思路啊。

很生气,到最后还没肝出 G 和 H,愤怒交卷。也许我的实力就不配赛时切 G 和 H 吧……

分数分布

嗯,该过的题都过了,行。

赛后题解

A

纯暴力即可,枚举多少只鸡,看剩下的腿数是不是 \(4\) 的倍数。注意鸡的数量可以是 \(0\)

B

观察发现需要最小化的就是 \(|a_n - a_1|\),因此只要其中有一个数不固定就尽可能让这两个数相等。中间的不固定数就全填 \(0\) 好了,为了最小化字典序嘛。

C1

如果原本的情况能平局,那么没有人能够胜出,因为即将胜的一方会被即将败的一方调整至平局,因此只存在平局情况。

否则的话,考虑倒序找第一个 \(i\) 满足 \(a_i \not= b_i\),隐含规则其实就是,谁的回合处理这个关键元素,谁就能赢,毕竟异或的性质且只有 \(0\)\(1\) 嘛,那么只要看 \(i\) 的奇偶性情况就可以了。

C2

和 C1 同样的,原本情况能平局那就是平局。

之后的核心逻辑,就是在 C1 的基础上加了寻找关键元素位置的一个步骤。因为 C1 拆了二进制位后总是只有一位嘛,处理起来特方便,但 C2 这里就不同了要找到具体是哪一位最关键。

那这个关键位是哪里呢?首先求出原本情况,\(a\) 的是 \(A\)\(b\) 的是 \(B\)。求 \(D = A \oplus B\)\(D\) 的最高位 \(h\) 就是这个关键位了。求 \(a\)\(b\) 两个数组中分别有多少个值在 \(h\) 位有值,记为 \(ca\)\(cb\),奇偶性相同依然平局,否则就根据这个像 C1 一样倒序找就可以了。

D

拆分,连通块。

注意到选择一个中间点 \(mid\),拆成两个区间 \([1,mid]\)\([mid+1,n]\) 之后,如果这两个区间分别形成的连通块相互之间连通不起来,说明什么?说明 \([1,mid]\) 这一段区间的最小值都比 \([mid+1,n]\) 这一段区间的最大值要大。只有这种情况是构不成的。那么前缀后缀 \(\min\) 一求,判断一下就完了。

E

显然构造题。周期性问题。尝试搞个以不知道啥长度为周期的排列,然后依着这个构造就行。

发现长度为 \(12\)\(\{1,2,4,5,6,3,7,9,12,11,8,10\}\) 是不会有一组“坏索引”的,又发现其中的最大公约数都是 \(12\) 的约数,那么这就是一个完美的周期排列。

问题在于 \(n\) 不总是 \(12\) 的倍数啊,不是怎么办,就从余数对应的区间中取在范围内的按照上面那个周期顺序放好,会有“坏索引”,但是你可以依次尝试 \(1 \sim 11\) 所有情况,“坏索引”的个数都不会超过 \(6\),因此是完美的。

F

D 的加强版,判断方法讲完了,这边只讲如何构造这个树。

锁定 \(i\)\(i\) 往后的后缀中最大的一个点 \(j\)\([i,j]\) 这一段连起来,再把 \(j\)\(i\) 往前的前缀中最小的一个点连起来,就连通了,继续递推让 \(i = j+1\) 就可以啦!

G

考虑尽可能多的翻倍操作,找最小的 \(k\),让每个 \(i\) 都有 \(a_i \times 2^k \le b_i\)。接着让 \(c_i = b_i - a_i \times 2^k\),翻倍过程中可以在每个 \(c_i\) 二进制位为 \(1\) 的情况下多做一次 \(+1\) 操作,统计 \(\sum \operatorname{popcount}(c_i)\) 加进步数里。以及这期间也有调整顺序,同一位上先调谁再调谁最后调谁,用桶统计下然后阶乘算入方案数。最后就看累加答案那一块该怎么弄,先是总和阶乘,然后乘法逆元处理,除掉每种 \(i\) 的次数的阶乘,这样就能不重复。于是一开始要预处理阶乘和逆元操作,快速幂写好,时刻取模,就结束了。

H

首先可以考虑定义 \(dp_{i,j}\) 表示当前考虑前 \(i\) 个数且 \(a_i = i+j\)。由于 \(a\) 必须严格单调递增,我们通过转化可以变为 \(j\) 非递减。于是有转移 \(dp_{i,j} = \max_{k \le j} dp_{i-1,k} + v(i,j)\),至于这个 \(v\) 可以写个函数出来,是 \(\log\) 的时间复杂度。

但是这样过不去,尝试压维,弄成 \(dp_{j}\),于是 \(j\) 需要倒序枚举。但是依然不行,时间复杂度过不去,考虑用树状数组维护区间 \(\max\) 来处理这个东西。于是就结束啦!

posted @ 2025-11-21 21:45  嘎嘎喵  阅读(44)  评论(0)    收藏  举报