Live2D

Solution Set - Codeforces Global Round 1~8

记号 含义
🏃 VP 参赛/现场赛
🚶 单纯做题 (一般是因为以前做过一些)
* 参考题解
^ 以前做过
~ (🏃 的场次) 赛后独立过掉
🔼 推荐场次
🔽 不推荐场次/屑题
不难但值得一看的的好题
✡️ 神题

Defining LATEX macros

  没做的大概率是懒得看了, 兔是这样的. (

Codeforces Global Round 1 🏃🔼

  Contest link.

Remark.

  个人体验来说, ABC 写得比较慢, 竞速赛还是打少了. 但是 E 的一眼盯真又让节奏莫名其妙加快, 再因为 F 不想写 log2 导致没时间写 G 的讨论 (虽然补题的时候发现讨论仍有瑕疵).

  除了 E, 题目质量不错, 推荐.

A. Parity

  O(k) 模拟即可.

B. Tape

  用恰好 k 条不重合的胶带一定不劣. 选择最大的几个 bibi1 不覆盖即可. 使用 std::nth_element 做到 O(n).

C. Meaningless Operations

  • 「C.性质/结论」

  CF 风味诈骗题. 设 2k1a<2k, 注意到 gcd(0,x)=x, 当 a+12k 时, 取 b=2k1a, 答案达到上界 2k1. 当 a+1=2k 时怎么办呢… 这样的 a 只有二十来个, 打表预处理出答案即可. 不计本地打表时间的话, 复杂度自然是 O(q) 的.

  当然, 我们也可以再想想计算 a=2k1 的不那么暴力的方法: gcd(ab,a & b)=gcd(2k1,b), 因此答案为 a 的最大非平凡因子, 这就很好算了.

D. Jongmah

  • 「A.DP-序列 DP」「C.性质/结论」

  按颜色装桶, 画出桶的直方图以获得一些直观结论. 注意到如果一个 3×3 的直方图区域被全部使用, 我们完全不用关心它是横着分成三组还是竖着分成三组. 竖着分是平凡的, 所以我们规定这样的区域被竖着分. 此时在我们的最终分组中, 对于同一个 a, (a1,a,a+1) 不会出现超过两次, 则 aa 后面的元素横向覆盖的次数不超过 4 次.

  得到了这些常数的上界就能设计状态了, 令 f(i,a,b) 表示处理了 1i, i1 剩下 a2 个必须被后面的东西覆盖, i 剩下 ab4 个必须被后面的东西覆盖, 直接转移就行. 复杂度 O(n+tm), t 为一个关于转移次数的常数.

E. Magic Stones 🔽

  超级无敌史诗级经典老番, 变换操作就是交换相邻两个差分值, 因此 a,b 能互相转化当且仅当 a1=b1, an=bn{aiai1}i=2n={bibi1}i=2n. 复杂度 O(nlogn), logn 来自离散化或者 std::map.

F. Nearest Leaf ⭐

  • 「A.数据结构-线段树」「B.离线」「C.思维」

  一眼盯了一百个 log2 的做法, 因为赌气不想写, 又想了一大会儿.

  分析被卡住的原因: 像给出区间 [l,r] 这样的询问, 如果尝试离线, 太容易先入为主地去按照区间端点离线. 而这题恰恰利用特殊的结点编号形式, 按询问的 v 离线. 得到这个离线思路之后就没有障碍了.

  具体来说, 我们将询问按照 v 离线, 在树上 DFS 枚举结点, 同时维护所有叶子当到前结点 u 的距离. 当从 u 经由边权为 w 的边走向儿子 v 时, v 子树内的所有距离 w, 其余所有距离 +w, 从 v 回溯时则相反. 查询则需要求出一段区间内距离的最小值. 线段树维护这一过程, 可以做到 O((n+q)logn).

Remark.

  清新的数据结构, 去套路化的思考要求, 挺不错的题. 按 v 离线的 motivation 是关键.

G. Tree-Tac-Toe *⭐

  • 「C.性质/结论」

  题不难, 描述结论真的麻烦. 这题要求我们进行目的明确的分讨并简洁地描述结论.

  首先是对已经被染白的结点的转化. 已有的白点可以制造先手, 那么构造一个先手局面就能表示白点. 具体地, 对于白点 u, 加入新点 x,y,z, 连接 (u,x),(x,y),(x,z). 经过先后手的分析可以发现先手直接染 u 一定不劣, 且一定不可能利用 x,y,z 产生原来没有的局面, 因此这样的构造等价于 u 为白色.

  到此, 我们只需要分析无色的树了.

  • 结论一: 若存在 du4, 则白胜.

  • 结论二: 若存在 du=3, 且 u 的邻接点中有至少两个非叶结点, 则白胜.

  证明都是显然的. 此时我们只剩下一种不平凡的情况:

  设 u,v 为左右两端的三度点, 则链上所有到 u 的距离为奇数的点都是先手, 且对方仅能在左侧染色应对; 到 v 的距离为奇数的点也是先手, 且对方仅能在右侧染色应对. 因此当且仅当 d(u,v) 为偶数时先手必胜. 其余情况必然平局. 复杂度 O(n).

Remark.

  先构造性地转化 "已有白色", 从而大大简化讨论, 第一步的 motivation 值得留意.

Codeforces Global Round 2 🚶

  Contest link.

Remark.

  如果赛上切 A~F 的话, 似乎并没有什么很好玩的题. G 和 H 可以补一补, 不太推荐 VP.

A. Ilya and a Colorful Walk

  如果左右同色, 答案一定产生于到左端或者右端; 如果左右异色, 答案是 n1. O(n).

B. Alyona and a Narrow Fridge

  顺序枚举 k, 最有策略显然是排序后从大到小两两分组, 如果有单就单出最小的. 最粗糙的 O(n2logn) 也能过.

C. Ramesses and Corner Inversion

  一贯从 "可行操作张成的向量空间" 理解这类题. 注意到 2×2 的操作在行上叠加, 可以得到同两行上的两个 2×1, 再将这两个 2×1 在列上叠加, 可以得到任意矩形的四个角, 而这正是我们的可行操作. 因此, 可行操作张成的向量空间就是所有 2×2 的操作张成的空间. 也即是, 原规则下有解, 等价于仅使用 2×2 操作有解. 直接模拟一编就行. O(nm).

D. Frets On Fire

  对于给定 [l,r], 第 i 条弦内出现的数为 [si+l,si+r]. 暴力处理询问的话, 我们自然会选择将区间按照左端点排序. 事实上这一顺序是恒定的, 我们可以先排出来. 称 si+1si 为排序后两根弦 ii+1 之间的 gap, 显然当 rl+1 不超过 gap 时, 两条线段的贡献独立; 当 rl+1 超过 gap, 两条线段中间全部被覆盖, 贡献就与 rl+1 无关了. 贡献形式是一个分段函数. 因此我们再按照 gap 排序, 询问时二分出恰好未被 bridge 的 gap 的位置, 算算前后的贡献就做完了. 复杂度 O((n+q)logn).

E. Pavel and Triangles

  • 「B.贪心」

  差点看成上一场的 D 了. (

  显然, 三角形的边长的形式必然是 (x,y,y), xy. 如果 2y 配对是一定的, 即, 对于每个 y, 我们知道有多少对 2y 组成了最终方案中的三角形, 那么 (x,2y) 之间就是一个简单的括号贪心匹配.

  接下来的贪心也是自然的: 我们先将所有 2y 全部配对, 从后到前扫描一遍以求出所有必然失配的 x. 此后, 再将剩下的 2y 拆开. 拆开的过程肯定是拆开小的 2y, 和两个大的 2y 分别匹配. 这部分损失是 O(1) 的. 总之就是 O(n) 贪心一遍结束.

F. Niyaz and Small Degrees ^

  Solution.

G. Get Ready for the Battle ^

  • 「A.构造」

  观察样例, 猜测答案能取到下界 ihi/n. 这为我们的构造指明了目标. 为了不造成浪费, 我们关注所有 himodn 的值. 发现取 himodn 排序后的差分为分组方案, 循环填数, 就能达到最优.

  兔也不知道当时怎么想的, 所以很 unmotivated. 复杂度 O(n).

H. Triple ⭐

  • 「A.数学-生成函数」「A.数学-FWT」

  看着挺有意思的 (因为是数数题), 来玩一玩.

  令原条件中的 x,y,z 分别为 p,q,r, 令集合幂级数 Fi(z)=pzai+qzbi+rzci, 答案则为

F(z)=i=1nFi(z),

其中乘法为异或卷积. 当然, 这肯定是需要引入 FWT 的. 令 F,Fi 为左右项 FWT 后的结果, 则

[zS]F(z)=i=0n[zS]Fi(z).

又当然, 这个 Fi(z) 没办法直接求, 我们需要手动变换. 由于

[zS]Fi(z)=(1)|Sai|p+(1)|Sbi|q+(1)|Sci|r,

{p,q,r} 的线性组合, 且仅有 23 种, 我们可以尝试计数每一种组合的出现次数. 另一方面, 通过令 ai0,biaibi,ciaici, 可以固定 p 的系数恒为 1 以减少讨论.

  到此, 对于每个 (S,x,y), 我们需要求出

c(S,x,y)=i=1n[(1)|Sbi|=x][(1)|Sci|=y].

S 固定时, 要求的则是 c(,),c(,+),c(+,),c(+,+). 每个 c 中都带有两个真值表达式, 并不好算. 但是如 c(,)+c(,+) 的线性组合却能完美避免这个问题. 令 B(z)=i=1nzbi, C(z) 同理, D(z)=i=1nzbiΔci, 那么可以列出线性方程组:

{c(,)+c(,+)+c(+,)+c(+,+)=n,(c(+,)+c(+,+))(c(,)+c(,+))=[zS]B(z):=u,(c(,+)+c(+,+))(c(,)+c(+,))=[zS]C(z):=v,(c(,)+c(+,+))(c(,+)+c(+,))=[zS]D(z):=w.

最后一个等式的构造相对较麻烦, 如果先猜想这种形式再去找组合意义可能会快一点.

  肯定有家伙懒得解方程吧! 还是把解列一下:

{c(,)=14(uv+w+n),c(,+)=14(u+vw+n),c(+,)=14(   uvw+n),c(+,+)=14(   u+v+w+n).

  挺好看的. 利用方程解出 c(x,y), 算出 F(z) 再逆变换回去就行. 复杂度 O(n+k2k). 引入更多的元, 形式化罗列和解方程也是可以做到的, 不过这道题已经被加强过了.

Codeforces Global Round 3 🏃🔼

  Contest link.

Remark.

  __builtin_parity / __builtin_parityll, 你们他妈赶快滚进标准库重载成一个东西.

A. Another One Bites The Dust

  答案是 2c+2min{a,b}+[ab].

B. Born This Way

  你好, 兔这题就做复杂了. 这里就只提正解吧.

  Arkady 的策略是显然的: 找到最小的可用 ai, 然后找到最小满足 ai+tabjbj, 在 bj+tb 时刻到达 C 地. 那直接枚举我们保留下的最小 ai, 从第一个可用 bj 开始往后删直到删满 k 个, 对当前答案取最大值即可. 双指针做到 O(n).

C. Crazy Diamond

  • 「A.构造」

  注意到一个位置 i 一定能跳到的位置只有 1 或者 n. 于是我们保留这两个位置, 先让 2n1 归位. 枚举 px=2..n1, 先让 x 跳到 1n, 如果不能直接跳到 px 就跳到另一端再向 px 跳. 2n1 归位后, 检查一下是否需要交换 p1,pn. 最劣情况使用 4n±O(1) 次交换.

D. Dirty Deeds Done Dirt Cheap

  • 「A.构造」

  你好, 兔又做复杂了. 这里就只提正解吧.

  显然 ai<bi 的数对不能和 ai>bi 的数对交叉贡献. 仅考虑 ai<bi 的情况, 惊讶地发现按 ai 降序排列就满足条件了. O(n).

  兔写的线段树维护贪心.

E. Earth Wind and Fire

  • 「B.贪心」

  注意到操作可以不改变石头间的相对顺序, 所以将 {sn},{tn} 排序后, 我们可以钦定 si 被移动到 ti. 这时, 若有 i<j, si<ti 的石头和 sj>tj 的石头可以相互拉进靠近自己的目标点. 于是按顺序扫描, 像括号匹配一样贪心地拉进就行了. 复杂度为排序的 O(nlogn).

F. Foo Fighters ~

  • 「A.构造」

  不妨设原来所有 vali 之和 >0. 虽然所有 bit 的地位是相同, 我们还是可以尝试插一棵 Trie 树辅助思考. 对于 u 子树, 设其左右儿子的贡献已经确定为 x,y, 我们可以通过 u 对应的 bit 得到 x+y 或者 xy. 那如果说 x<0, 我们就高枕无忧了.

  如何找到这样一个 x<0 呢? 注意到没有 maski=0, 而所有 vali 之和 >0, 所以从根到最左结点的路径上, 一定存在一个结点仅有和 >0 的右子树, 相当于找到了 x=0,y>0, 调整这个位置的 bit 使之贡献 y, 一路回溯回去不会使贡献增大, 这样就构造出答案了.

  实现的时候排个序就行, 复杂度是排序的 O(nlogn).

  注意 __builtin_parity(unsigned int), __builtin_parityll(unsigned long long). 心态整炸了.

Codeforces Global Round 4 🏃

Remark.

  可能是信心场, 可以找状态的时候做.

A. Prime Minister 🔽🔽🔽

  EI 读了六分钟题, 兔只读了五分钟, 兔看不起英语不好的人. (

  题意: 问所有不超过 a1 一半的 ai 加起来再加上 a1, 是否超过所有数总和的一半.

  这 A 题怕是整场比赛阅读量最大的. 😠

B. WOW Factor

  对于每个 o, 求其前面的 vv 数乘上后面的 vv 数. O(n).

C. Tiles

  左上角 4 种方案, 其余第一行或者第一列上的 2 种方案, 此后其他格子被唯一确定. 因此答案是 2w+h. O(log(w+h)).

D. Prime Graph

  猜测当 [n,3n/2] 内有素数, 先连一个环, 然后加边把一些点的度数变成 3, 直到总边数为素数即可. O(n). 范围内的 n 可以很快枚举验证, 但一般情况兔完全不会证明 qwq.

E. Archaeology

  左右双指针向内扫, 相邻不等的性质保证我们一定能选出足够数量的配对. O(n).

F. Short/Long Colorful Strip

  • 「A.DP-计数 DP」「A.DP-区间 DP」

  F2 并不困难, 兔并没有思考 F1 的特殊解法, 就不分开讲了.

  我们定义一个区间 [l,r] 是完备的, 当且仅当出现在 [l,r] 中的颜色仅出现在 [l,r] 中. 设当前考虑的完备区间为 [L,R], 被染成当前颜色的位置为 Lp1<p2<<pkR. 那么, 我们要求 (pi,pi+1) 是完备段, 递归进去算贡献. 难点在于对 [L,p1][pk,R] 这段区间是否被当前颜色染的讨论.

  注意到这样一个事实: 当某个时刻 cici+1, 则该时刻之后都必然有 cici+1. 因此, 设我们实际染色区间为 [s,t] (Lsp1, pktR), 则 [L,s), [s,p1), (pk,t], (t,R] 都需要是完备区间. 当完备区间的一个端点固定时, 另一个端点仅有 O(n) 个可能位置. 完备区间总数当然也是 O(n2) 的, 因此直接记忆化搜索求出完备区间 [1,m] 的答案即可. 注意无解判定, 复杂度 O(n3+m).

G. The Awesomest Vertex ~⭐

  • 「A.分块」「A.数据结构-线段树」「B.Tricks」

  看着榜上一大堆和兔一样一小时前六道然后调不出 G 的人, 兔就放心了. (

  绝对值? 绝对不能带着绝对值! 注意 |x|=max{x,x}, 而我们要求的是 max{|a|×b}, 一开始就维护好 max{a×b}max{a×b} 就没有绝对值了.

  法一 在 DFN 上转化后, 我们需要处理的问题是: 区间 aiai+k (k>0), 区间询问 max{ai×bi}. 分块+单调队列维护凸包可以简单 O((n+q)n). (你说得对, 但是真的难调, 分块都好难调啊!)

  法二⭐ 考虑直接用线段树维护直线 bix+aibi. 由于 x 单增, 所以区间内最大值的取值点单调向右移动, 有意义的移动不超过 O(len2) 次 (直线交点数量). 虽然凸包本身没办法合并, 但最有答案和最近的有意义移动点是可以简单记录的. 势能分析可以得到 O((n+qlogn)log2n) 的复杂度, 兔没有细看证明 qwq. 可以参考这里. UPD: 这个很像 KTT?

Codeforces Global Round 6 🏃

  Contest link.

A. Competitive Programmer

  各位数字之和为 3 的倍数, 拿一个后导 0 后还有偶数位.

B. Dice Tower

  一个骰子的相对两面之和恒为 7, 由此只有最上面一个骰子的方向需要被考虑.

C. Diverse Matrix

  观察样例, 猜测最小 magnitude 为 r+c, 于是我们需要将 1r+c 安排为每行每列的 gcd. 设行列 gcd{Rr},{Cc}, 尝试令 aij=Ri×Cj. 当 1R, 可以让所有列的 gcd 一定合法, 反之亦然; 当 x,x+1R, 也可以让所有列的 gcd 一定合法, 反之亦然. 那么构造就很简单了. O(rc).

D. Decreasing Debts

  只要每个人应得的总钱数一定, 方案就合法. 求出这一数值, 随便匹配欠债关系即可. O(n).

E. Spaceship Solitaire

  设 ci=j[uj=i], 则答案有下界 imax{0,aici}. 可以证明下界可取, 当然作为 competitor 的兔可以不证明. (

F. Almost Same Distance 🔽

  • 「C.性质/结论」「C.细节」

  这个 🔽 仅用于表达兔对细节题的讨厌.

  当 k 一定时, 合法点集一定为存在一个或两个相邻花蕊的, 花瓣很长的菊花. 枚举花蕊, 记录好子树深度后可以求答案. 同时注意到 anskansk+2, 所以可以取远端更新然后继承答案. 精细扫描线可以做到 O(n).

  妈的当时不想写题解, 现在也不想写.

Codeforces Global Round 7 🏃🔼

Remark.

  这场挺创人的. E 和 F1, F2 挺好玩儿, D 可能写着比较烦人 (指在 VP 状态下写细节讨论).

A. Bad Ugly Numbers

  3 填最低位, 其余位用 2 来调整模 3 余数. O(n).

B. Maximums 🔽

  按题意模拟, O(n). 您这题放哪个水平都不 educational 吧.

C. Permutation Partitions

  产生最大值贡献的一定是前 k 大, 找到它们的位置, 中间的分隔点随意移动, 乘法原理算方案即可. O(n).

D. Prefix-Suffix Palindrome

  去除已经回文的前后缀, 求 S+$_+rev(S)rev(S)+$_+S 的 border 决策剩下的回文. KMP 做到 O(n).

E. Bombs

  答案不增, 立马把问题转化成判断预期答案 x 是否可行. x 活下来的条件是: 存在一个 i, 使得 i 后面 x 的数严格多余 i 后面的炸弹数. 线段树维护差值最小值即可. O(nlogn).

F1. Wise Men (Easy Version)

  • 「A.DP-状压/插头 DP」「B.Meet in Middle」

  一个很勉强的 meet in middle 做法. 我们暴力 DP 时, 需要记录已选人的集合状态和当前字符串的状态, 414 肯定不行. 但注意字符串对转移形式没有任何影响, 所以可以 meet in middle: 只求出所有 n/2 个人的集合产生的字符串状态, 然后两半拼起来算方案数. 这样减轻了对字符串状态的记录压力, 复杂度毛估为 O((nn/2)×2n), 其实也就在暴力基础上除了个 n.

F2. Wise Men (Hard Version) *✡️

  • 「A.数学-FWT」「B.Tricks」「C.思维」

  [S1S2=]zS1S2=[|S1S2|=|S1|+|S2|]zS1S2, 多个 S 同理. 这是子集卷积的原理, 但也是一个巧妙的转化 "不交" 的技巧.

  F1 中, 我们利用 "字符串对转移形式无影响" 的性质完成了 meet in middle, 而这种 "无影响" 还能更深入的挖掘 — 将 "构造字符串" 分拆为多个几乎独立的计数情景.

  具体地, 我们枚举字符 1_ 的连续段 (也可以是空段, 对应单个人), 将它们有序地排列到 n 个位置上. 不同段间可能仍然有 1_, 只需要简单子集容斥一下.

  如何安排序列呢? 首先可以 DP 出将集合 S 串成全 1_ 路径的方案数. 枚举 n 的整数拆分, 求出满足条件的子集组合方式, 最终就能得到每种整数拆分对应的方案数. 然后枚举最终答案字符串, 找到其极大连 1_ 段划分对应的方案数, 对这一组方案数子集容斥, 就能得到答案. 复杂度 O(2npart(n)).

Remark.

  这种完全跳出 DP 灵活地使用已知技巧计数的东西好酷. (

Codeforces Global Round 8 🏃

Remark.

  狙击场, 任何系列赛事都是越出越难是吧 qwq.

A. C+=

  (a,b) 能一步变成 (a+b,a) 或者 (a+b,b), 你说你应该选哪种呢?

B. Codeforces Subsequences

  均匀的一堆 c_, 一堆 o_, 一堆 d_, …, 一堆 s_, 这样肯定最省长度. 目测一下也不会构造出意料之外的子序列. 那么就 O(k1/|S|) 结束了.

C. Even Picture

  兔在《world.construct(me);》加强了这道题.

D. AND, OR and square sum

  注意到 iai 恒定, 而一次操作可以将 bit "富集" 向其中一个数, 这正是最大化平方和所期望的. 因此, 把每个 bit 尽量向前集中就能得到最优的 {an}.

E. Ski Accidents

  • 「A.构造」

  7=1+2+4, 尝试把中转点分为 A,B,C 三组, 满足 |C|2|B|4|A|, 此时扔掉 C 就非常合适了.

  在二叉树结构上的 A,B,C 更像是三染色. 染色可得:

  • A: 入边 (若存在) 都来自 C.

  • B: 入边存在且都来自 A.

  • C: 存在入边来自 B.

  正确性不难证明. 复杂度 O(n).

F. Lamps on a Circle

  • 「A.构造」「C.非传统-交互题」

  直接考虑收敛到的状态. 在 Bob 操作之前, 肯定不存在一个长于 k1 的亮灯连续段, 否则 Alice 的操作就无效了. 在这种情况下, 最优的可能状态为 (1_k10_)+[:n], 不过需要令最后一位为 0_. 计算此时 1_ 的数量为 n1(n1)/k, Bob 跟上操作后剩下 n(n1)/kk, 所以可以在 n 附近找到最优的 k. 交互时一直用这个 k 来构造目标序列即可.

posted @   Rainybunny  阅读(172)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-03-02 Solution -「HDU #6566」The Hanged Man
点击右上角即可分享
微信分享提示