重庆八中周赛 12


\[\large \text{Round 9 : Cqbz Weekly Round 12} \]

一言:
雨滴降落的速度是每秒十米,我该用怎么样的速度,才能将你挽留?
——言叶之庭

感觉这场比赛挺有意思的,除了T3的大模拟被某巨佬拉开了差距,其他的题目感觉完成情况都比较正常吧。

\(\text{F : middle}\)

这是一道可持久化的好题。

首先由于要求这个范围内最大的中位数,再看看这个询问数才 \(5\times 10^4\),不想到二分这个中位数。

那么接下来考虑一个 \(\text{check}_x\)

为了方便描述,我们假设序列中所有小于等于 \(x\) 的值为 \(-1\), 大于 \(x\)\(1\)。实际上,要让一个中位数合法,就是看他在这个区间内的和是不是 \(0\)

由于你无论如何怎么选中位数都需要考虑 \([b,c]\),所以先直接查询 \([b,c]\) 里面的数的和是多少,假设为 \(x_1\)

然后我们在 \([a,b-1]\) 中找到一个最大的 \(x\),满足 \([x,b-1]\) 的和最大,为 \(x_2\)

同理,我们再在 \([c+1,d]\) 里面找到一个最小的 \(x\),满足 \([c+1,x]\) 的和最大,为 \(x_3\)

\(x_1+x_2+x_3 < 0\),就可以说明无论你怎么选区间,你小于等于 \(x\) 的数永远都会比大于 \(x\) 的数多,故 \(x\) 显然不合法,应该将 \(l=x-1\)

否则,就说明就算 \(x\) 不合法,也会有大于等于 \(x\) 的其他中位数合法,也就是 \(r=mid\)

这样就可以找到答案了。

秩序怎么维护的话,考虑以权值为时间戳,数组下标为线段树维护的东西,剩下的还是比较好想了。

\(\text{Submission}\)

\(\text{What I learned:}\)

  • 关于 T5 的一些 \(\text{trick}\),如果相同的数之间有不同,考虑通过他们在数组下的下标区分它们。

  • 二分的时候,有可能这个数不合法,但是如果你能够找到一个大于这个数(或者小于这个数)合法,那仍然可以二分。

  • 要通过贡献的大小来求区间,可以考虑找到所有可能成为答案区间的共性,然后只考虑他们之间不同的地方,来判断他们的大小。

  • 将小于 \(x\) 的变成 \(-1\),大于 \(x\) 的变成 \(1\),是一个很常用的技巧。

posted @ 2024-03-04 15:21  Saltyfish6  阅读(2)  评论(0编辑  收藏  举报
Document