CF85D Sum of Medians
题目描述
在一种著名的第 $k$ 小值查找算法中,需要将所有元素分成连续的五个一组,并找到每组五个元素的中位数。中位数指的是一个有序数组的中间元素(对于一个五个元素的组来说,就是五个的元素中的第三大)。为了提升该算法的运算效率,你需要能够求出数组中每五个元素的中位数的和。
已排序的 $k$ 元素集合 $S = \{a_1, a_2, ..., a_k\}$ 的中位数和定义为:
$$
\sum_{i \bmod 5 = 3}^{i \le k} a_i.
$$
其中,$\bmod$ 运算符表示取余,即 $x \bmod y$ 表示 $x$ 除以 $y$ 的余数。
现需支持高效地对变动集合求中位数和的操作。
输入格式
第一行包含一个整数 $n$($1 \leq n \leq 10^5$),表示操作次数。
接下来每行描述一种操作,共 $n$ 行,操作有三种:
- add $x$ —— 向集合中加入元素 $x$;
- del $x$ —— 从集合中删除元素 $x$;
- sum —— 输出当前集合所有五元组的中位数之和。
对于任一 add $x$ 操作,保证操作前 $x$ 不在集合中。
对于任一 del $x$ 操作,保证操作前 $x$ 在集合中。
输入中的所有数字均为正整数,且不超过 $10^9$。
输出格式
对于每个 sum 操作,输出当前集合中所有五元组的中位数之和。如果集合为空,输出 $0$。
请勿在 C++ 中使用 %lld 读写 64 位整数。建议使用 cin、cout 流(也可以使用 %I64d)。
说明/提示
由 ChatGPT 5 翻译