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