1691: [Usaco2007 Dec]挑剔的美食家
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 926 Solved: 477
[Submit][Status][Discuss]
Description
与很多奶牛一样,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想知道,为了让所有奶牛满意,他最少得在购买食物上花多少钱。
Input
* 第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
Output
* 第1行: 输出1个整数,表示使所有奶牛满意的最小花费。如果无论如何都无法 满足所有奶牛的需求,输出-1
Sample Input
4 7
1 1
2 3
1 4
4 2
3 2
2 1
4 3
5 2
5 4
2 6
4 4
1 1
2 3
1 4
4 2
3 2
2 1
4 3
5 2
5 4
2 6
4 4
Sample Output
12
输出说明:
给奶牛1吃价钱为2的2号牧草,奶牛2吃价钱为4的3号牧草,奶牛3分到价钱
为2的6号牧草,奶牛4选择价钱为4的7号牧草,这种分配方案的总花费是12,为
所有方案中花费最少的。
输出说明:
给奶牛1吃价钱为2的2号牧草,奶牛2吃价钱为4的3号牧草,奶牛3分到价钱
为2的6号牧草,奶牛4选择价钱为4的7号牧草,这种分配方案的总花费是12,为
所有方案中花费最少的。
code
贪心,之后查找前驱,
treap,splay,set等都支持
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 }