「模拟赛」多校 A 层联训 8(更新 T3)

\(22pts\),本来可以切掉前两个题的?!

A. 传送 (teleport)

签到

12 pts,错的很唐!我把 Dij 用的 dis 数组直接赋值成了点到 1 号点之间的 x 距离和 y 距离的最小值,没再赋成极大值,这样会改变 Dij 过程中点遍历到的顺序,然后就跑不出最短路了。

好像不能算挂分?但其实赛时有点感觉是这的问题了,但怎么就是没改了试试呢!!

正解:

对于传送,直接分别按 X 和 Y 为关键字排一次序,排序后相邻的点建边跑 Dij 就做完了。

B. 排列 (permutation)

简单排列组合

官方题解状压发现想不到,所以考虑直接组合做降低这道题的难度,这样我们就多了一个签到!

由于 \(\frac n k\le 10\),所以 k 的倍数最多有 10 个。

那么我们直接枚举所有 k 的倍数的全排列,时间复杂度为 \(O(\frac n k!)\) ,然后判断枚举出的排列中哪几对两两相邻的数的最大公约数为 k,这些对相邻的数之间必须要有一个其他的数把两个数隔开。

设有 \(mst\) 对相邻的数有最大公约数为 k,\(num=\frac n k\),那么在剩余的数中选出 \(mst\) 个数先隔开这些不能相邻的数(需要考虑顺序),方案为 \(A^{mst}_{n-num}\)

然后把选出的 \(mst\) 个数看成与其左边的数绑在一起,那么现在有 \(num\) 个位置有数,还有 \(num+1\) 个位置可以放数,剩下的这 \(n-num-mst\) 个数就随便放,其实就是【有顺序的 \(n\) 球放在 \(m\) 个盒子里,盒子可以为空】的问题(你怎么知道我赛时这个式子推错了,然后 T2 只有特殊性质分),设 \(rest = n-num-mst\),方案数为 $rest!\times C_{rest+num+1-1}^{num+1-1} $。

那么答案就是,对于所有 \(1-\frac n k\) 的不同的排列,\(\sum A^{mst}_{n-num}\times rest!\times C_{rest+num+1-1}^{num+1-1}\)

总时间复杂度为 \(O(\lfloor \frac n k\rfloor !\times \lfloor \frac n k\rfloor )\)

C. 战场模拟器 (simulator)

线段树(不难)

看起来好吓人哦!但是其实很简单。

发现其实每个 CTH 只会死一次,最多死 \(n\) 个 CTH,并且每次操作最多添加一个护甲,最多添加 \(Q\) 个护甲,所以遇到这两种情况直接暴力就行。

线段树维护区间 已死亡 CTH 数量、区间最小值、区间最小值个数。(一个 CTH 的的生命值若为负,则不算入区间最小值中)

  • 对于询问:

    • 询问已死亡 CTH 数量直接回答就好;
    • 询问濒死 CTH 数量查看区间最小值是否为 0,若是则答案为区间最小值个数,否则为 0。
  • 对于更新:

    • 添加盾时,set 维护一个 pair 双元组,第一个数为盾的位置,第二个数为盾的数量,每次判断该位置是否有盾,若有的话,取出把盾的数量加 1 再加进去,没有则插入 1 的数量;
    • 区间 \([l,r]\) 减生命值 \(x\) 时,先在 \([l,r]\) 区间把所有有盾的位置找到,将其盾的数量减 1,并且把所有有盾的位置单点修改生命值加 \(x\),然后 \([l,r]\) 区间整体减 \(x\)
    • 加生命值直接区间加。
posted @ 2024-10-17 16:02  Aqr_Rn  阅读(62)  评论(2编辑  收藏  举报