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; |