HDU 4864

http://acm.hdu.edu.cn/showproblem.php?pid=4864

#include <iostream>

#include <cstdio>

#include <cstring>

#include <set>

#include <cmath>

#include <map>

#include <queue>

using namespace std ;

typedef __int64 ll ;

struct node

{

    int x,y ;

    friend bool operator <(node a,node b)

    {

        if(a.x==b.x)a.y<b.y ;

        return a.x<b.x ;

    }

}ma[100005],ta[100005] ;

int cmp(node a,node b)

{

    if(a.x==b.x)return a.y>b.y ;

    return a.x>b.x ;

}

int main()

{

    int n,m ;

    multiset <int> S[105] ;

    while(~scanf("%d%d",&n,&m))

    {

        for(int i=0 ;i<=100 ;i++)

            S[i].clear() ;

        for(int i=0 ;i<n ;i++)

        {

            scanf("%d%d",&ma[i].x,&ma[i].y) ;

            S[ma[i].y].insert(ma[i].x) ;

        }

        for(int i=0 ;i<m ;i++)

            scanf("%d%d",&ta[i].x,&ta[i].y) ;

        sort(ta,ta+m,cmp) ; 

        multiset <int>::iterator it ;

        ll cnt=0,ans=0 ;

        for(int i=0 ;i<m ;i++)

        {

            int x=ta[i].x ;

            int y=ta[i].y ;

            for(int j=y ;j<=100 ;j++)

            {

                if(S[j].empty())continue ;

                it=S[j].lower_bound(x) ;

                if(it==S[j].end() || *it<x)

                {

                    continue ;

                }

                else

                {

                    cnt++ ;

                    ans+=(ll)((ta[i].x)*500+(ta[i].y)*2) ;

                    S[j].erase(it) ;

                    break ;

                }

            }

        }

        printf("%I64d %I64d\n",cnt,ans) ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(HDU)