第一次知道并查集可以这么用
思路:
对于5W个数据 可以类似线段树一样,将其点作为解决途径,虽然数据范围大,但是数据量并不大。在并查集时只需要将 任务在某一时刻被解决作为入手途径。对于第一次到达的点 Fx==x-1 逐步更新到0即可
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=50000+5;
typedef long long ll;
priority_queue < ll ,vector<ll >,greater<ll > >q;
struct node
{
int first,second;
}a[maxn];
int father[maxn];
int find(int x)
{
if(x<=0) return -1;
if(x==father[x]) {return father[x]=x-1; }
else return father[x]=find(father[x]);
}
int cmp(node x,node y)
{
return x.second>y.second;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].first>>a[i].second;
father[i]=i;
if(a[i].first>n) a[i].first=n;///这句没有也过,数据较弱,但是应该有
}
sort(a,a+n,cmp);
ll ans=0;
for(int i=0;i<n;i++)
{
if(find(a[i].first)>=0)
ans+=a[i].second;
}
cout<<ans<<endl;
}