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

题目链接

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

解题思路

40pts

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

有以下贪心方式:

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

  • 若对于一个可取数字区间有 \(l2 \le x \le r2\),则必然取数字 \(x\),取的数字数量为 \(r1\)

  • 否则,则有 \(x < l2\)\(r2 < x\),此时我们容易求得 \([1,x-1]\) 的数字个数取值区间 \([s1,s2]\)\([x+1,10^9]\) 的数字个数取值区间 \([s3,s4]\)。然后我们分讨以下情况:

    • \(s1 \le s3 \le s2\)\(s3 \le s1 \le s4\),此时前后两区间长度可以相交,那么使得两区间长度一致那么数字 \(x\) 就可以被取到,因此此情况 \(x\) 可以被取到。

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

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

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

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

总时间复杂度 \(O(n^2)\)

60pts

特殊性质 A 做法。

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

总时间复杂度 \(O(n)\)

80pts

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

100pts

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

参考代码

等代码公示后放。

posted @ 2025-03-03 18:20  wangmarui  阅读(48)  评论(0)    收藏  举报