joj2645

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;
}

你可能感兴趣的:(joj2645)