ARC174 rt记录

赛时过了 ABCDE(5/6)

F 出题人是弱智吧,出奇偶分讨模拟题,赛后重写了一遍代码就过了。


E. Existence Counting#

题意:给出 n,k 和序列 P1...k。称一个序列是好的,当且仅当长度为 k,所有整数范围为 [1,n] 并且两两不同,这里保证 P 是好的。对于每个数 x[1,k],求字典序 P 的所有好序列中 x 的出现次数。

1kn3×105

考虑枚举第一个不同的位置 i

那么对于数字 P1...i1,他们多出现了 对应方案数 次。

对于其他数字,可以分为两部分:<Pi 的和 Pi 的,同一部分的数字贡献都是一样的。

cnt 表示 <Pi 的数字个数。

  • <Pi 的贡献

可以在 i 位置出现,也可以在后面出现。

加起来,为 A(ni,mi)+(cnt1)(mi)A(ni1,mi1)

  • Pi 的贡献

cnt(mi)A(ni1,mi1)

总方案数为 cnt×A(ni,mi)

我们需要支持给 [1,Pi1] 中除去 P1...i1 的数字做加法,给 [Pi,n] 中除去 P1...i1 的数字做加法。

考虑倒着枚举 i,每次把 Pi 的贡献清零,使用树状数组即可。


F. Final Stage#

题意:Alice 和 Bob 玩游戏。给出 l1...n,r1...n,编号为奇数的是 Alice 玩,偶数是 Bob 玩。有一堆石子,现在 i=1...n,每次当前玩家取出一些石子,个数为 [li,ri],不能取的玩家输,对手赢。有 q 次询问,每次给出 C 表示石子个数,求谁能赢,或者都不会赢。

1n,q3×105, 1liri109

朴素的 dp 是简单的,设 f[i,j] 表示从 in 游戏,初始石子个数为 j,是否能赢。

我们考虑直接维护 f[i,],输和赢一段一段交替出现,最后一段是平局。

考虑维护 f[i,] 的差分,即相邻两段的分界线。

发现每次其实会给输的段的 [l,r] 做加法:ll+li, rr+ri,然后把所有段的输赢状态取反。

用差分描述:把第奇数个 1 往右平移 li 单位,把第偶数个 1 往右平移 ri 单位,然后给位置 1 赋值成 1

注意到有些平移后输的段可能满足 l>r,此时我们需要消去对应的两个 1

考虑使用两个堆 q1,q2,分别维护奇偶两种,相邻的 1 之间的距离。若距离为 0,就可以消去。

每次取出 q1q2 进行更新即可,两个堆都还要额外围护一个整体加法标记。

我们还需要动态支持消去一些 1,考虑使用链表维护每个 1 的位置即可。

时间复杂度 O(nlogn)

出处:https://www.cnblogs.com/Sktn0089/p/18079551

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Lgx_Q  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示