// [7/23/2014 Sjm]
/*
又坑在TLE上了。。。。
Each machine can only complete a task one day. Each task can only be completed by one machine.所以想到了贪心。。。
发现 dollars = 500*xi+2*yi, 由于 xi(0<xi<1440),yi(0=<yi<=100), 500*1 > 2*100,所以 dollars 的决定因素是需要的时间,
那么就尽可能先解决需要时间多的任务,同时选择的时间和难度水平尽可能接近任务的机器,如此即可求得最优解。
不过,先前写的代码一直TLE,后来用 Judge[101][1441] 做一个预处理,AC。。。。
*/
1 #include <iostream>
2 #include <cstdlib>
3 #include <cstdio>
4 #include <algorithm>
5 #include <cstring>
6 using namespace std;
7 typedef __int64 int64;
8 const int MAX = 100005;
9 int N, M, len;
10
11 struct node {
12 int time;
13 int lev;
14 };
15
16 bool Cmp(const node n1, const node n2) {
17 if (n1.time == n2.time) {
18 return n1.lev > n2.lev;
19 }
20 else {
21 return n1.time > n2.time;
22 }
23 }
24
25 node task[MAX];
26 int Judge[101][1441];
27
28 void Solve()
29 {
30 int num = 0;
31 int64 money = 0;
32 for (int i = 0; i < M; ++i) {
33 for (int j = task[i].lev; j <= 100; ++j) {
34 int k;
35 for (k = task[i].time; k <= 1440; ++k) {
36 if (Judge[j][k]) {
37 Judge[j][k]--;
38 num++;
39 money += (500 * task[i].time + 2 * task[i].lev);
40 break;
41 }
42 }
43 if (k != 1441) {
44 break;
45 }
46 }
47 }
48 printf("%d %I64d\n", num, money);
49 }
50
51 int main()
52 {
53 //freopen("input.txt", "r", stdin);
54 while (~scanf("%d %d", &N, &M)) {
55 memset(Judge, 0, sizeof(Judge));
56 int x, y;
57 for (int i = 0; i < N; ++i) {
58 scanf("%d %d", &x, &y);
59 Judge[y][x]++;
60 }
61 for (int i = 0; i < M; ++i) {
62 scanf("%d %d", &task[i].time, &task[i].lev);
63 }
64 sort(task, task + M, Cmp);
65 Solve();
66 }
67 return 0;
68 }