专栏文章

题解:P11924 [PA 2025] 贪婪大盗 / Piracka Chciwość

P11924题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipspfqc
此快照首次捕获于
2025/12/03 17:19
3 个月前
此快照最后确认于
2025/12/03 17:19
3 个月前
查看原文
遗憾离场。看上去像个分析性质题,实际上比较暴力。
首先暴力从后向前模拟,维护 fif_i 表示当前想让这个人同意的话,需要分给他 fif_i 个金币。显然从小到大选,复杂度是 O(n2logn)\mathcal O(n^2\log n)
核心性质是每个人分得的钱数一定不会超过 max(a)\max(a)(记为 ww)。证明就是在 ii1i\rightarrow i-1 的时候,令 Si1=[i1,n]SiS_{i-1}=[i-1,n]\setminus S_i 一定合法。
所以用线段树维护集合 Ai,jA_{i,j} 表示如果当前想让他同意,需要花费 ii 个金币,贪婪值等于 jj 的点的位置集合。
处理到 ii 的时候,从小到大枚举金币数量,什么时候需要的总和大于 mm 了或者人数合法了就停下。然后很讨厌的限制是金币相同的话编号从大到小选,所以确定了给出的最大金币数 kk 后,<k<k 的所有人都要选,然后所有 =k=k 的人选的是一段后缀。所以在所有 Ak,A_{k,\ast} 上同时进行一个线段树二分,即可找出需要的区间。
这样操作就是,对于不选的人,金币数全部归零,然后所有人的金币数都加上各自贪婪值。这里会发生若干合并和分裂,需要线段树合并和分裂实现。这样是 O(na2logn)\mathcal O(na^2\log n) 左右。
注意到一个人清零之后,金币数就一定是他自己贪婪值的倍数,所以对于还没被清零过的数暴力处理(一个人最多被暴力处理 256/a256/a 次),然后需要维护的线段树棵数是 O(aloga)\mathcal O(a\log a) 级别的。这样复杂度可以优化到 O(n(aloga+d(a)logn))\mathcal O(n(a\log a+d(a)\log n)),实际远远跑不满。

评论

0 条评论,欢迎与作者交流。

正在加载评论...