大意
给定一些时刻前打碎一些玻璃获得的价值,求最大价值
思路
有两种想法是可行的,第一种是 h e a p heap heap,第二种是并查集,这里主要讨论并查集
先按价值排序,然后对于每个可选择的物品,选了之后向左边连边,表示这个时间已被占用,这样就可以求出最优解了,时间复杂度: O ( n l o g n + n α ( n ) ) O(nlogn+n\alpha(n)) O(nlogn+nα(n))
代码
#include<cstdio>
#include<algorithm>
using namespace std;long long n,f[200001],tot,t,p,s;
struct node{long long t,p;}a[200001];
inline bool cmp(node x,node y){return x.p>y.p||x.p==y.p&&x.t<y.t;}
inline long long find(long long x){return x==f[x]?x:f[x]=find(f[x]);}
signed main()
{
scanf("%lld",&n);
for(register int i=1;i<=n;i++)
{
scanf("%lld%lld",&t,&p);
if(p>0) a[++tot]=(node){min(t,n),p};
f[i]=i;
}
sort(a+1,a+1+tot,cmp);
for(register int i=1;i<=tot;i++)
{
int fx=find(a[i].t);
f[fx]=find(fx-1);//向上一个时间点离连边
if(fx) s+=a[i].p;//时间是够的
}
printf("%lld",s);
}