[省选联考 2025] 幸运数字
luogu 题面
题意:
给你一个空的可重集合,往里面加 \(N\) 次数,每次加的数个数范围是 \([l_{i,1},r_{i,1}]\),大小范围是 \([l_{i,2},r_{i,2}]\),问有多少个数可能成为此集合的中位数。中位数的定义为:集合中所有元素从小到大排序后的第 \(\lfloor\frac{N+1}{2}\rfloor\) 个元素。本题数量和大小的范围都是 \(10^9\)。
考场上我的思路是先看暴力!算了一下 \(N=4\) 的复杂度,感觉非常的复杂。不知道为什么会认为枚举每个数的个数和范围的复杂度是 \(O(r^2)\),当时感觉 \(80\ pts\) 可做。越想越不对发现其实只剩暴力了。哈哈。看看性质,性质 \(A\) 是每个元素的个数不会超过 \(N\) 个,感觉不是很有用。性质 \(B\) 是每个数的个数确定。当时以为个数都确定了算个前缀和就确定在哪个区间了,二分一下,不对都不用二分直接扫一遍可过,纯傻。
又想了想,发现画个数轴,每个修改的值域都是一段连续的区间是吧,那么对于某一段值域来说,它的最大和最小可能有的数的数量其实是确定的,比方说图中这一块绿色的部分。
【此处缺图,若干个线段重叠在一起,一块绿绿的,标出最大最小可能数量】
发现重叠情况不同的只有 \(O(N)\) 个区间,我们可以把每一段区间拿出来考虑(有点像扫描线的)。然后狠狠地贪心,发现一个数最有可能是中位数的时候,这个数的数量要尽可能多,它两边的数个数的差要尽量小。
【此处缺图,一段小黄,一段长长的小黄】
考虑一段区间,我们可以把可能出现在这个区间内的数都放在这个区间里的某个位置上,完全不可能出现在这个区间内的数再放到两边的区间里,如果这个区间里的某一个位置可以成为整个集合的中位数,那么这一段区间都可以做中位数。狠狠地贪心。
【此处缺图,一个小绿在大绿里跑】
判断一个区间是否可以成为中位数,显然是看两边的最小差值拉(但是奇数和偶数的情况是不是还需要特判一下呢)。或许可以简化一下,把左右区间的数量减去都有的部分,剩下的部分只需要看小黄是否能覆盖中位数的位置。仔细思考一下,两边数量永远不可能相等时,只需要用两边数量差最小的情况下判断。
【此处缺图,两个条,下边是简化后的】
【此处缺图,奇数小黄,偶数小黄,共4条】
代码实现过程,在读入每个修改时,在每个值域左右端点加上修改操作(具体是加在哪里呢),然后排序,然后从头到尾扫一遍,初始状态下所有数都在左边的区间。维护一个当前区间最大数量,左右两边最大最小数量,在每个端点上进行修改之后计算区间是否合法,修改答案。
【如果这道题我确实过了,我就会尝试找到我的代码,把它贴在这里】
虽然是一眼不会不可做不想做的题,但最后还是努力拿下了!这个故事告诉我们一个道理,世上无难事只要肯放弃思考!放在平时肯定是火速 get 题解或者去看别的题了,但是考试环境下还是很有思考力的。 也许没有人知道我十一点还在努力写正解但是害怕思路假,没想就感觉很崩溃,不过还是接着写写写。
浙公网安备 33010602011771号