题目链接:点击打开链接
//先考虑时间在考虑优先级
#include<stdio.h>
#include<string.h>
#include<map>
#include<stdlib.h>
using namespace std;
struct node
{
int x,y;
}a[110000],b[110000];//a存机器 b存任务
int comp(const void *a,const void *b)
{
struct node *c;
struct node *d;
c=(struct node *)a;
d=(struct node *)b;
if(c->x==d->x)
return d->y-c->y;
return d->x-c->x;
}
int main()
{
map<int ,int >mapp;
int i,n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d %d",&a[i].x,&a[i].y);
for(i=0;i<m;i++)
scanf("%d %d",&b[i].x,&b[i].y);
qsort(a,n,sizeof(a[0]),comp);//机器 任务都先按时间降序排列 再按优先级降序排列
qsort(b,m,sizeof(b[0]),comp);
int ans1,j;
__int64 ans2;
ans2=0;
ans1=j=0;
mapp.clear();
for(i=0;i<m;i++)//遍历任务
{
while(j<n&&a[j].x>=b[i].x)//对于每一个任务先找时间比它长的机器
{
mapp[a[j].y]++;//把找到的机器优先级存起来
j++;
}
map<int ,int >::iterator it=mapp.lower_bound(b[i].y);//返回第一个优先级大于等于任务的机器的位置
if(it!=mapp.end())//如果找到
{
ans1++;
ans2+=b[i].x*500+b[i].y*2;
int t=it->first;
mapp[t]--;//优先级为t的减少一个
if(mapp[t]==0)
mapp.erase(t);
}
}
printf("%d %I64d\n",ans1,ans2);
}
return 0;
}