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