TonyYin's Blog

Back

题意#

mm 位玩家 1m1\sim m,初始血量均为 33。玩家活着当且仅当生命值大于 00.

nn 次按时间顺序给定的追杀操作,每次形如 (uk,vk)(u_k,v_k),追杀操作按顺序进行。

执行操作 uu 追杀 vv 时,若二者都活着,那么 vv 的生命值减 11;否则不执行该操作。

现在有一名特殊玩家 00 号,可以选取任意 (i,v)(i,v),其中 1in+11\leq i\leq n+11vm1\leq v\leq m,表示时空穿越到第 ii 次追杀前,并追杀玩家 vv

显然 (i,v)(i,v) 共有 (n+1)×m(n+1)\times m 个不同的选择方法,且不同的 (i,v)(i,v) 会导致最终存活玩家的集合不同。

对每个 0xm0\leq x\leq m,求有多少种 (i,v)(i,v) 的选取方法,使最终恰有 xx 位玩家存活,输出 m+1m+1 个数。

1n6×1041\leq n\le 6\times 10^41m1031\leq m\leq 10^31ui,vim1\leq u_i,v_i\leq m.

对于 16%16\% 的数据,n,m100n,m\leq 100.

对于另外 41%41\% 的数据,n103n\leq 10^3.

对于 100%100\% 的数据,1n6×1041\leq n\leq 6\times 10^41m1031\leq m\leq 10^31ui,vim1\leq u_i,v_i\leq m.

可以接受 O(nm)\mathcal{O}(nm) 的复杂度。

题解#

暴力?O(n2m)\mathcal{O}(n^2m).

fi,jf_{i,j} 表示:若在 ii 前穿越,追杀 jj,最后存活的玩家数量。

对于追杀操作 (u,v)(u,v),无论在它前面还是后面,插入一个操作 (0,xu)(0,x≠u),对结果的影响都是相同的。

因此,只有当 j=uij=u_i 时,fi+1,jfi,jf_{i+1,j}≠f_{i,j},其他情况下都有 fi,j=fi+1,jf_{i,j}=f_{i+1,j}.

所以我们尝试在每个操作 (u,v)(u,v) 前插入追杀 uu 的操作,插入后 O(n)\mathcal{O}(n) 模拟一遍进程,更新 fi,uif_{i,u_i}.

这样的复杂度是 O(n2)\mathcal{O}(n^2) 的。

注意到,若第 ii 次追杀操作没有生效,也有 fi,j=fi+1,jf_{i,j}=f_{i+1,j},因此只需对所有生效的操作重新跑一遍。

最多有 3m3⁢m 次生效操作,复杂度变为 O(nm)\mathcal{O}⁡(n⁢m),可以通过。

【洛谷-P7568】「MCOI-05」追杀
https://www.tonyyin.top/blog/oi-solution/p7568
Author TonyYin
Published at February 6, 2022
Comment seems to stuck. Try to refresh?✨