ARC174 rt记录
赛时过了 ABCDE(5/6)
F 出题人是弱智吧,出奇偶分讨模拟题,赛后重写了一遍代码就过了。
E. Existence Counting
题意:给出 \(n,k\) 和序列 \(P_{1...k}\)。称一个序列是好的,当且仅当长度为 \(k\),所有整数范围为 \([1,n]\) 并且两两不同,这里保证 \(P\) 是好的。对于每个数 \(x\in [1,k]\),求字典序 \(\le P\) 的所有好序列中 \(x\) 的出现次数。
\(1\le k\le n\le 3\times 10^5\)
考虑枚举第一个不同的位置 \(i\)。
那么对于数字 \(P_{1...i-1}\),他们多出现了 对应方案数 次。
对于其他数字,可以分为两部分:\(<P_i\) 的和 \(\ge P_i\) 的,同一部分的数字贡献都是一样的。
设 \(cnt\) 表示 \(<P_i\) 的数字个数。
- \(<P_i\) 的贡献
可以在 \(i\) 位置出现,也可以在后面出现。
加起来,为 \(A(n-i,m-i)+(cnt-1)(m-i)A(n-i-1,m-i-1)\)。
- \(\ge P_i\) 的贡献
为 \(cnt(m-i)A(n-i-1,m-i-1)\)。
总方案数为 \(cnt\times A(n-i,m-i)\)。
我们需要支持给 \([1,P_i-1]\) 中除去 \(P_{1...i-1}\) 的数字做加法,给 \([P_i,n]\) 中除去 \(P_{1...i-1}\) 的数字做加法。
考虑倒着枚举 \(i\),每次把 \(P_i\) 的贡献清零,使用树状数组即可。
F. Final Stage
题意:Alice 和 Bob 玩游戏。给出 \(l_{1...n},r_{1...n}\),编号为奇数的是 Alice 玩,偶数是 Bob 玩。有一堆石子,现在 \(i=1...n\),每次当前玩家取出一些石子,个数为 \([l_i,r_i]\),不能取的玩家输,对手赢。有 \(q\) 次询问,每次给出 \(C\) 表示石子个数,求谁能赢,或者都不会赢。
\(1\le n,q\le 3\times 10^5,\space 1\le l_i\le r_i\le 10^9\)
朴素的 dp 是简单的,设 \(f[i,j]\) 表示从 \(i\) 到 \(n\) 游戏,初始石子个数为 \(j\),是否能赢。
我们考虑直接维护 \(f[i,]\),输和赢一段一段交替出现,最后一段是平局。
考虑维护 \(f[i,]\) 的差分,即相邻两段的分界线。
发现每次其实会给输的段的 \([l,r]\) 做加法:\(l\gets l+l_i,\space r\gets r+r_i\),然后把所有段的输赢状态取反。
用差分描述:把第奇数个 \(1\) 往右平移 \(l_i\) 单位,把第偶数个 \(1\) 往右平移 \(r_i\) 单位,然后给位置 \(1\) 赋值成 \(1\)。
注意到有些平移后输的段可能满足 \(l>r\),此时我们需要消去对应的两个 \(1\)。
考虑使用两个堆 \(q_1,q_2\),分别维护奇偶两种,相邻的 \(1\) 之间的距离。若距离为 \(0\),就可以消去。
每次取出 \(q_1\) 或 \(q_2\) 进行更新即可,两个堆都还要额外围护一个整体加法标记。
我们还需要动态支持消去一些 \(1\),考虑使用链表维护每个 \(1\) 的位置即可。
时间复杂度 \(O(n\log n)\)。