「杂题乱刷2」P11830 [省选联考 2025] 幸运数字

题目链接

P11830 [省选联考 2025] 幸运数字

解题思路

40pts

考虑直接暴力 check 每个数字 x 是否能被取到。

有以下贪心方式:

  • 如果根本不可能取到至少一个数字 x,则 x 不能被取到。

  • 若对于一个可取数字区间有 l2xr2,则必然取数字 x,取的数字数量为 r1

  • 否则,则有 x<l2r2<x,此时我们容易求得 [1,x1] 的数字个数取值区间 [s1,s2][x+1,109] 的数字个数取值区间 [s3,s4]。然后我们分讨以下情况:

    • s1s3s2s3s1s4,此时前后两区间长度可以相交,那么使得两区间长度一致那么数字 x 就可以被取到,因此此情况 x 可以被取到。

    • 否则,我们分讨以下两种情况。

      • s2<s3,那么此时前面取 s2 个数字,后面取 s3 个数字显然最优,算出此时中位数是否为 x 即可。
      • 否则一定有 s4<s1,那么此时前面取 s1 个数字,后面取 s4 个数字显然最优,算出此时中位数是否为 x 即可。

那么这样 check 一次是 O(n) 的。

考虑去暴力做特殊性质 A 的 n 个数字,依次 check,可以获得 40 分。

总时间复杂度 O(n2)

60pts

特殊性质 A 做法。

依然考虑上述 check 方式,你发现根据 x 的递增性,每个数字区间 [l2,r2] 只会给 s1,s2,s3,s4 带来连续一段区间的贡献,那么直接差分后进行一次前缀和即可。

总时间复杂度 O(n)

80pts

经过惊人的注意力(打表)可以发现,我们可以将 l2,r2 离散化,此时就会有 2n 个点,发现若一个点是合法的,则这个点往左有一段连续的区间也是合法的,此时直接二分即可,时间复杂度 O(n2log2n),可以获得 80 分。

100pts

考虑优化 80pts 做法,那么你发现我们可以直接将原本需要暴力做的区间离散化,由于需要差分加减的点只有 2n 个,那么直接离散化这些差分端点,二分即可查找到准确前缀和之后的值,那么一次 check 复杂度就被降到了 O(logn),总时间复杂度 O(nlog2n),可以通过此题。

参考代码

等代码公示后放。

posted @   wangmarui  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
历史上的今天:
2024-03-03 「杂题乱刷」洛谷 P4801
2024-03-03 「杂题乱刷」CF1934D2
点击右上角即可分享
微信分享提示