正题
题目大意
有n个东西,东西必须在aisa_i\ sai s前破坏,破坏后可以获得wiw_iwi价值,求最大价值。
解题思路
我们可以将时间从大到小排序,然后用堆,每次处理价值最大的就好了。
code
#include<cstdio>
#include<queue>
#include<algorithm>
#define ll long long
#define N 200100
using namespace std;
struct node{ll t,w;
}a[N];
ll n,last,ans;
priority_queue<ll> q;
bool cmp(node x,node y)//排序
{return x.t==y.t?x.w>y.w:x.t>y.t;}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld%lld",&a[i].t,&a[i].w);sort(a+1,a+1+n,cmp);for(ll i=1;i<=n;i++){if(a[i].w<0) continue;q.push(a[i].w);for(ll j=a[i+1].t;j<a[i].t&&!q.empty();j++){ans+=q.top();q.pop();}}printf("%lld",ans);
}