http://acm.jlu.edu.cn/joj/showproblem.php?pid=2645
这个题目实际上是我博客里那个带时效的作业排序问题的一个应用,是利用并查集来降低时间的复杂度,
但是这个题目需要注意的是数值的范围,用int已经远远达不到数值的要求了。。。。
#include<stdio.h>
#include<algorithm>
using namespace std;
class NODE
{
public:
long long p;
long long d;
};
NODE node[100000+2];
int selected[100000+2];
int find(int v)
{
return (selected[v]=(selected[v]==v?v:find(selected[v])));
}
bool cmp(const NODE&n1,const NODE&n2)
{
return n1.p>n2.p;
}
int main()
{
freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)==1)
{
long long max=-1;
for(int i=0;i<n;i++)
{
scanf("%lld%lld",&node[i].p,&node[i].d);
if(node[i].d>max)max=node[i].d;
}
long long sum=0;
sort(node,node+n,cmp);
for(int i=0;i<=max;i++)
{
selected[i]=i;
}
for(int i=0;i<n;i++)
{
int v=find(node[i].d);
if(v>0)
{
sum=sum+node[i].p;
selected[v]=v-1;
}
}
printf("%lld\n",sum);
}
return 0;
}