与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了。现在,Farmer John不得不去牧草专供商那里购买大量美味多汁的牧草,来满足他那N(1 <= N <= 100,000)头挑剔的奶牛。 所有奶牛都对FJ提出了她对牧草的要求:第i头奶牛要求她的食物每份的价钱不低于A_i(1 <= A_i <= 1,000,000,000),并且鲜嫩程度不能低于B_i(1 <= B_i <= 1,000,000,000)。商店里供应M(1 <= M <= 100,000)种不同的牧草,第i 种牧草的定价为C_i(1 <= C_i <= 1,000,000,000),鲜嫩程度为D_i (1 <= D_i <= 1,000,000,000)。 为了显示她们的与众不同,每头奶牛都要求她的食物是独一无二的,也就是说,没有哪两头奶牛会选择同一种食物。 Farmer John想知道,为了让所有奶牛满意,他最少得在购买食物上花多少钱。
* 第1行: 2个用空格隔开的整数:N 和 M
* 第2..N+1行: 第i+1行包含2个用空格隔开的整数:A_i、B_i * 第N+2..N+M+1行: 第j+N+1行包含2个用空格隔开的整数:C_i、D_i
* 第1行: 输出1个整数,表示使所有奶牛满意的最小花费。如果无论如何都无法 满足所有奶牛的需求,输出-1
1 #include<cstdio>
2 #include<algorithm>
3 #include<cstring>
4 #include<cmath>
5 #include<iostream>
6
7 using namespace std;
8
9 #define lson t[k].l
10 #define rson t[k].r
11 typedef long long LL;
12 const int N = 200100;
13
14 struct Data{
15 int l,r,key,val,cnt;
16 }t[N];
17 struct Node{
18 int x,y;
19 bool operator < (const Node &c) const {
20 if (x==c.x) return y < c.y;
21 return x < c.x;
22 }
23 }a[N],b[N];
24 int tn,Root,ans;
25 LL Ans;
26
27 inline char nc() {
28 static char buf[100000],*p1 = buf,*p2 = buf;
29 return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
30 }
31 inline int read() {
32 int x = 0,f = 1;char ch = nc();
33 for (; ch<‘0‘||ch>‘9‘; ch = nc()) if (ch==‘-‘) f = -1;
34 for (; ch>=‘0‘&&ch<=‘9‘; ch = nc()) x = x * 10 + ch - ‘0‘;
35 return x * f;
36 }
37 inline void lturn(int &k) {
38 int a = rson;
39 rson = t[a].l;
40 t[a].l = k;
41 k = a;
42 }
43 inline void rturn(int &k) {
44 int a = lson;
45 lson = t[a].r;
46 t[a].r = k;
47 k = a;
48 }
49 void Insert(int &k,int x) {
50 if (k==0) {
51 ++tn;k = tn;
52 t[k].cnt = 1;
53 t[k].val = x;t[k].key = rand();
54 return ;
55 }
56 if (x == t[k].val) t[k].cnt++;
57 else if (x > t[k].val) {
58 Insert(rson,x);
59 if (t[rson].key < t[k].key) lturn(k);
60 }
61 else {
62 Insert(lson,x);
63 if (t[lson].key < t[k].key) rturn(k);
64 }
65 }
66 void Delete(int &k,int x) {
67 if (k==0) return ;
68 if (t[k].val == x) {
69 if (t[k].cnt > 1) {t[k].cnt --;return ;}
70 if (t[lson].val * t[rson].val == 0) k = lson + rson;
71 else if (t[lson].key < t[rson].key) rturn(k),Delete(k,x);
72 else lturn(k),Delete(k,x);
73 }
74 else if (x > t[k].val) Delete(rson,x);
75 else Delete(lson,x);
76 }
77 void getpre(int &k,int x) {
78 if (k==0) return ;
79 if (x >= t[k].val) ans = k,getpre(rson,x);
80 else getpre(lson,x);
81 }
82 int main() {
83 int n = read(),m = read();
84 for (int i=1; i<=n; ++i)
85 a[i].x = read(),a[i].y = read();
86 for (int i=1; i<=m; ++i)
87 b[i].x = read(),b[i].y = read();
88
89 sort(a+1,a+n+1);
90 sort(b+1,b+m+1);
91
92 int i = 1,j = 1,c = 0;
93 for (; i<=m; ++i) {
94 while (a[j].x <= b[i].x && j <= n) Insert(Root,a[j].y),j++;
95 ans = -1;getpre(Root,b[i].y);
96 if (ans==-1) {c++;continue;}
97 Delete(Root,t[ans].val);
98 Ans += b[i].x;
99 }
100 if (j <= n || (m-c)<n) cout<<"-1";
101 else cout<<Ans;
102 return 0;
103 }