背了重展的锅 de了两个小时,说实话stl真心救命
这道题主要就是优先选择贪心,同时比较s
把s从大到小排列 每次让其按顺序入队 下一个入队时考虑新加入的a[i].s因为每一次s递减所以维护起来十分方便

#include <bits/stdc++.h>
using namespace std;
#define int long long

const int maxn=2e5+7;
priority_queue<int , vector<int >, greater<int > > pa;

struct node {
  int v,s;
}a[maxn];

bool cmp(node a,node b)
{
  return a.s>b.s;
}
signed main()
{

  int n;
  cin>>n;
  for (int i=1;i<=n;++i)
  {
    cin>>a[i].v>>a[i].s;
  }
  sort(a+1,a+n+1,cmp);///反排序
  int cnt=0,w=0,ans=0;
  for (int i=1;i<=n;++i)
  {
    ++cnt;
    pa.push(a[i].v);
    ans+=a[i].v;
    while (cnt>a[i].s)///当前队元素大于入队s
    {
      --cnt;
      ans=ans-pa.top();
      pa.pop();
    }
    w=max(w,ans);

  }
  cout<<w<<endl;
  return 0;
}