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\) 次后水量,则有:
然后倍增跳就行了。如果你把传递关系看成有向边,实际就是 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)\)。
瞎做锤子,貌似要离线后线段树二分或者在线主席树,烫完了。

浙公网安备 33010602011771号