题意:有n个人,每个人都有一个选票,第i个人想要选编号为ai的人,如果想贿赂这个人让他选自己,就需要花费bi,问想让自己获胜(得票最多)的最小花费是多少。
思路:枚举一下最终的得票数,那么对于比当前枚举的票数多的人,那么多出的那部分一定要买走,剩下的,就是在剩下的人中,选择花费最少的人让自己得到相应的票数。从大到小枚举票数,假设之前枚举到k,那么枚举k-1时,在k要收买多出的那部分在k-1的时候也要收买,因此,这部分人会不断减少。将花费从小到大排序以后,插入线段树,线段树维护区间和还有区间中还没被收买的人的数量。那么,如果枚举到k,此时一定要收买的人有p个,那么就要在线段树中找前k-p个人就好了。
代码:
#include
#include
#include
#include
#include
#include