CF1051G - Distinctification
CF1051G - Distinctification
题目大意
对于一个二元组集合 \(\{(a_i,b_i)\}\)
每次可以进行操作
1.如果存在 \(a_i=a_j\) ,可以花费 \(b_i\) 代价 \(a_i\) 增加1
2.如果存在 \(a_i=a_{j}+1\) ,可以花费 \(-b_i\) 代价使 \(a_i\) 减少1
现在依次向集合插入 \(n\) 个二元组,求在所有时刻,对于当前的集合进行操作
最终使得不存在 \(a_i=a_j\) 时的最小花费(可以为负)
分析
容易发现对于给定的 \(a_i\) 集合,最终 \(a_i\) 的集合唯一固定
具体的,每次插入一个数值 \(x\) ,如果出现重复就会不停将 \(x\) 向后推推推
而事实上答案为 \(\sum b_i\cdot (a'_i-a_i)\) ,那么只需要最小化 \(\sum b_ia'_i\)
容易发现在任意时刻,如果 \([L,R]\) 内所有 \(a_i\) 都出现,就可以任意交换他们的 \(b_i\)
那么最终状态中每一个 \(a_i\) 连通块内,按照 \(b_i\) 从大到小排序即可
每次插入一个元素维护连通块之间的合并以及求出 \(\sum b_ia'_i\) 即可
可以用启发式合并/线段树合并维护
1 | const int N=4e5+10,M=N*19,INF=1e9+10; |