ABC438

rk224。因为调了太长时间 F 最后直接放弃 G 了。

A - First Contest of the Year

因为 \(D,F\) 很小直接模拟就行了。

难于一般的 ABC A。

时间复杂度 \(O(D)\)

B - Substring 2

枚举 \(T\) 从那个位置开始和 \(S\) 匹配,然后暴力计算更新答案即可。

时间复杂度 \(O(nm)\)

C - 1D puyopuyo

我不知道为什么这么干但很有道理。

不难发现策略是能消就消,于是维护一个栈,栈顶出现 \(4\) 个相同数字就直接消掉。

最后答案就是栈的大小,复杂度为 \(O(n)\)

D - 1D puyopuyo

记三个数组的前缀和分别是 \(Sa,Sb,Sc\)

最终的答案为 \(Sa_x+Sb_y-Sb_x+Sc_n-Sc_y\)

枚举 \(y\),维护前缀最大的 \(Sa_x-Sb_x\),即可做到 \(O(n)\)

E - Heavy Buckets

考虑第 \(B_i\) 个杯子都经过了那些人的手里。

\(g_{i,j}\) 表示杯子 \(i\) 传递 \(2^j\) 次后到谁手里,\(f_{i,j}\) 表示杯子 \(i\) 传递 \(2^j\) 次后水量,则有:

\[g_{i,j}\gets g_{g_{i,j-1},j-1} \]

\[f_{i,j}\gets f_{i,j-1}+f_{g_{i,j-1},j-1} \]

然后倍增跳就行了。如果你把传递关系看成有向边,实际就是 CF702E。

时间复杂度 \(O(q\log T)\)

F - Sum of Mex

考虑经典套路,算出 \([0,x-1]\) 但不经过 \(x\) 的边有多少条,然后乘上 \(x\) 即可。

不太好做,换个套路算出经过 \([0,x]\) 的路径条数直接加,因为这些路径在 \([0,x-1],[0,x-2],\dots ,[0,0]\) 都做了贡献,所以新加上一次贡献。

如何计算经过 \([0,x]\) 的路径条数?

先考虑将 \(0\) 设置为跟,则所有经过 \([0,x]\) 的所有路径的并是一条过根的链,维护这个链,方案数是链两个端点内子树乘积(注意链的一个端点为跟的情况)。

假设维护出 \([0,x-1]\) 的所有路径的并,加入 \(x\),从 \(x\) 暴力跳祖先,若最后跳到链的端点上,则将端点修改到 \(x\),反之若跳到链内部,则不存在同时经过 \([0,x]\) 的路径。

时间复杂度为 \(O(n)\),初始预处理一下父亲和子树大小即可。

G - Sum of Min

我不管我赛时口胡出来就是切了。

假定 \(n<m\)。不难发现 \(\text{lcm}(n,m)\) 为一个周期。

考虑一个周期内的答案,每个 \(A_i\) 会和那些 \(B_j\)\(\min\),不难发现和 \(A_i\)\(\min\)\(B_j\) 构成了一个环,不难发现在能在这个环里和 \(B_j\)\(\min\)\(A_i\) 也是一个环。不难发现 \(A_i\) 划分的环和环不重叠,\(B_j\) 划分的环和环不重叠。

然后把两个环放在一起处理,排序后维护后缀和,每个 \(A_i\) 可以求出环里小于 \(A_i\)\(B_j\) 个数和大于 \(A_i\)\(B_j\) 之和,可以快速计算一个周期 \(A_i\) 会在这个环里匹配整整几轮。

对于边角的部分,每个数仍在环里计算边角部分会匹配整整几轮,剩下的瞎做,不难时间复杂度 \(O(n\log n)\)

瞎做锤子,貌似要离线后线段树二分或者在线主席树,烫完了。

posted @ 2025-12-27 22:24  zuoqingyuan111  阅读(57)  评论(0)    收藏  举报