题解:CF1866F Freak Joker Process

· · 题解

CF1866F

前言

本题解本质上是官解翻译+自己的一点理解,您认为官解更好理解当然可以直接看官解,链接。

阅读理解启动。

解法分析

题意:给 n 个二元组 (A_i,B_i),求:

RankA(i)=1+\sum_{A_i<A_j} 1 RankB(i)=1+\sum_{B_i<B_j} 1 RankOverall(i)=1+\sum_{RankA(j)+RankB(j)<RankA(i)+RankB(i)} 1

支持对 A,B 单点加减 1,单点查 RankOverall

使用操作分块。排名显然就是维护大于某数的个数,我们对值域维护 biggerA,biggerB 表示大于某数的个数。

转移到值域上以后发现,把一个数加减一只会影响一个值,换到下标就是相同值的所有位置。根据操作分块的套路,先将值域和下标在块内会被修改的值标记。

通过值域和下标的标记关系,可以将块内的点分成 4 种类型:

显然值域标记、非白点不超过块长个。

需要预处理一部分信息:

$cnt_{i,j}$:将值域标记模成数组,$A,B$ 权分别为第 $i,j$ 个标记的橙点个数。 对黄点的处理相对容易,先预处理出没变的权并根据它排序即可。橙点最多更新块长个,用 $cnt$ 更新即可。 对于查询,判断: - 蓝点,直接加。 - 橙白,$smallerOverall$ 预处理了。 - 黄色,二分答案判断即可。 复杂度 $O(n\sqrt{n\log n})$,精细实现优化二分可以 $O(n\sqrt n)$。 That's all.