http://poj.org/problem?id=3622
无限orz把STL用得淋漓尽致的大牛。。。
本题用贪心,先对cow的新鲜度进行降序,再对grass的新鲜度进行降序,方便待会在grass中查找符合grass[j].first>=cow[i].first的grass
注意pair的排序是firs比second优先,unique返回唯一元素的最后那个地址,还要注意输出要long long
#include<iostream>
#include<vector>
#include<map>
#include<stack>
#include<algorithm>
#include<queue>
#include<list>
#include<set>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
#include<ctype.h>
#include<iomanip>
using namespace std;
#define LL long long
#define pi acos(-1)
pair<int,int> cow[100010],grass[100010];
int main()
{
//freopen("a.txt","r",stdin);
int n,m;
int i,j,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d%d",&cow[i].second,&cow[i].first);
sort(cow,cow+n,greater<pair<int,int> >());
for(i=0;i<m;i++)
scanf("%d%d",&grass[i].second,&grass[i].first);
sort(grass,grass+m);
m=unique(grass,grass+m)-grass;
sort(grass,grass+m,greater<pair<int,int> >());
multiset<int> s;
multiset<int>::iterator it;
LL ans=0;
for(i=0,j=0;i<n;i++)
{
while(j<m && grass[j].first>=cow[i].first)
{
s.insert(grass[j++].second);
}
it=s.lower_bound(cow[i].second);
if(it!=s.end())
{
ans+=*it;
s.erase(it);
}
else
{
ans=-1;
break;
}
}
printf("%I64d\n",ans);
}
return 0;
}