题解:
每一次不能满足的时候
找一个之前有过的
然后最小的
和他替换
代码:
#include<bits/stdc++.h> using namespace std; const int N=100005; long long ans; int x[N],y[N],l,f[N],n,d[N]; void down(int x) { int i=x; if (x*2<=l&&d[x*2]<d[x])i=x*2; if (x*2<l&&d[x*2+1]<d[i])i=x*2+1; if (i!=x) { swap(d[i],d[x]); down(i); } } void up(int x) { if (x==1)return; if (d[x]<d[x/2]) { swap(d[x],d[x/2]); up(x/2); } } int cmp(int a,int b) { return x[a]<x[b]; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]),f[i]=i,x[i]=min(x[i],n); sort(f+1,f+n+1,cmp); for (int i=1;i<=n;i++) { d[++l]=y[f[i]]; up(l); ans+=y[f[i]]; if (x[f[i]]<l) { ans-=d[1]; d[1]=d[l--]; down(1); } } printf("%lld\n",ans); }