[68] (NOIP集训) NOIP2024 加赛 5

恐将成为我改题时间最长的一场(也是分最低的一场)

码长断崖式领先了

暴力操作

首先你肯定要让小于(等于)中位数的数变小,将较大的值变小是毫无意义的,因为即使你完全不管他们,也不会对答案造成任何影响,白白浪费费用

可以考虑二分答案枚举中位数是啥,然后尝试将前半段每个数都除到中位数以下,计算最小花费

可以注意到的是,如果一个数 ai 除以 x 能到达中位数以下,那么 x 的数都能做到,这告诉我们两点:一是可以二分答案求解这个 x,二是我们应该在所有这些合法的里面取一个费用最小值,对费用做后缀 min 即可

然后由整除分块经典结论,abc=abc,因此有可能提供的这个花费并不是最优花费,比如如果 cost6>cost2+cost3,这时用 6 就不如用 23,因此考虑分解其质因数,用质因数花费之和来更新当前值的花费

需要注意的是值域并不只到 V,一个 hack 是 V 很小,ai 很大,值域开小了可能出现超过二分上界的问题(即一个数需要被除很多次)

异或连通

线段树分治

按照线段树分治的思路直接做

这道题的难点在找到操作会影响哪些区间,上个结论

操作影响的区间一定形如若干连续段,且连续段不超过 log

证明:考虑拆位,操作 s 满足 sxorx<K,当且仅当存在某一位 i,使得对于任意更高位 jsjxorxj=Kj,且 sixorxi=1,Ki=0

如果我们对询问建一颗 Trie 树,符合要求的询问一定对应 Trie 上某个子树,如果我们事先对询问排序,那么对应的就是一个连续的区间了,由于 Trie 深度最高 log,因此连续段也不超过 log

因此,本题的方案就是:对询问建立 Trie 树,找到询问区间,然后直接线段树分治即可

民主投票

按照题目给的 “每个人只能投给父节点” 投票,我们可以通过二分答案计算出一个最大得票数量的最小值(意思就是把票尽可能均摊给每个人,让得票最多的那个人得的最小),记这个值为 s

记一个节点的子树大小为 si(不包含自己,因为自己无法给自己投票),现在我们要想让 i 赢,可以分成以下情况:

  • si>s,然而我们刚才得到的最大的票数量是 s,说明 i 最多只拿了 s 票,那么子树内就一定存在节点将票投给了 i 的祖先,现在这些节点将票收回来,都投给 ii 的票数只会增加(并最终大于 s,因为 si>s),祖先的票数只会减少,最终 i 可能是胜出者
  • si<s,和上述情况类似,即使子树内所有票都投给了 i,仍然不满足 sis,而子树内更不可能有 sis 的节点,但是现最大票数为 s,说明子树外一定有票数为 s 的节点,i 一定失败
  • si=s,此时需要特殊判断,这种情况下 i 想要胜出,可以先钦定最大票数只有 s1 票,这样多出来的票会汇集到根节点,此时钦定 i 获得了 s 票,并且由于子树外最大票数是 s1 票,因此 i 自己那一票只能直接传到根节点,否则不会胜利
posted @   HaneDaniko  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示