Loading

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)\)

posted @ 2024-03-18 07:44  Lgx_Q  阅读(40)  评论(0编辑  收藏  举报