「BZOJ 2653」middle「主席树」「二分」
题意 一个长度为 \(n\) 的序列 \(a\) ,设其排过序之后为 \(b\) ,其中位数定义为 \(b[n/2]\) ,其中 \(a,b\) 从 \(0\) 开始标号,除法取下整。给你一个长度为 \(n\) 的序列 \(s\) 。回答 \(Q\) 个这样的询问: \(s\) 的左端点在 \([a,b]\) 之间,右端点在 \([c,d]\) 之间的子序列中,最大的中位数。其中 \(a<b<c<d\) 。位置也从 \(0\) 开始标号。强制在线。 题解 比较套路地,我们考虑二分这个中位数(设为当前 \(mid\) ),如果它偏左就往右移,否则往左移 为了方便,若 \(x<mid\) ,它的贡献是 \(-1\) ,否则是 \(1\) ,这样我们只要看总贡献的正负就行 我们就求出 \([b + 1, c - 1]\) 的贡献,加上 \([a, b]\) 的最大后缀和 \([c, d]\) 的最大前缀 我们考虑怎么求一个区间 \([l, r]\) 对 \(c\) 的贡献的前缀max,后缀max,区间和。如果对下标开主席树,区间和可以,但前两个操作不太行。 考虑两维互换。先考虑 \([1, n]\) 对 \(1\) (注意这里已经离散化过了)的贡献,然后再移动到 \([1, n]\) 对 \(2\) 的贡献。我们发现总共只有 \(n\) 次 \(1\) 被改成 \(-1\) 的操作