题意
说服说有人
每个人可以用钱收买,或者达成说服了
人的条件
题解
我们可以考虑
的时候,能够达成条件的只有一个人,那么我肯定是留下
最大的。
以此类推,当
的时候,能够达成条件的可以有
个人。
为了使所有不等式满足,我们倒着推,并且一旦超过
,我们从中取出
最小的买了。
#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
typedef long long ll;
using namespace std;
const ll mod = 1e9+7;
const int maxn = 500050;
vector<int>G[maxn];
int n,p[maxn],m[maxn];
int main(){
int T;cin>>T;
while(T--){
scanf("%d",&n);
FOR(i,1,n)scanf("%d%d",&m[i],&p[i]);
FOR(i,0,n-1)G[i].clear();
FOR(i,1,n)G[m[i]].push_back(p[i]);
priority_queue<int,vector<int>,greater<int> >q;
ll ans=0;
for(int i=n-1;i>=0;i--){
for(auto x:G[i])q.push(x);
while(q.size()>n-i){
ans+=q.top();
q.pop();
}
//cout<<q.size()<<endl;
}
printf("%lld\n",ans);
}
}