【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家(set+贪心)

http://www.lydsy.com/JudgeOnline/problem.php?id=1691

懒得打平衡树了。。。。

而且multiset是很快的。。。

排到了rank1 T_T

贪心就是,先按价值(或美味度)从大到小排序,然后枚举每头牛,将所有美味度(价值)的食物大于当前牛的美味度(价值)的价值(美味度)放到平衡树中。

然后提出最小的那个值即可。(因为从大到小排序,所以平衡树中的所有的食物都满足美味度(价值)大于当前牛)

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

using namespace std;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define CC(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << #x << " = " << x << endl

#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }

inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }

inline const int max(const int &a, const int &b) { return a>b?a:b; }

inline const int min(const int &a, const int &b) { return a<b?a:b; }



const int N=100005;

struct dat { int x, y; }a[N], b[N];

inline const bool cmp(const dat &x, const dat &y) { return x.y>y.y; }

multiset<int> s;

typedef multiset<int>::iterator iit;

int n, m;



int main() {

	read(n); read(m);

	for1(i, 1, n) read(a[i].x), read(a[i].y);

	for1(i, 1, m) read(b[i].x), read(b[i].y);

	sort(a+1, a+1+n, cmp); sort(b+1, b+1+m, cmp);

	int j=1;

	long long ans=0;

	for1(i, 1, n) {

		while(a[i].y<=b[j].y && j<=m) { s.insert(b[j].x); ++j; }

		iit it=s.lower_bound(a[i].x);

		if(it==s.end()) { puts("-1"); return 0; }

		ans+=*it;

		s.erase(it);

	}

	printf("%lld", ans);

	return 0;

}

 

 


 

 

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

Sample Output

12

输出说明:

给奶牛1吃价钱为2的2号牧草,奶牛2吃价钱为4的3号牧草,奶牛3分到价钱
为2的6号牧草,奶牛4选择价钱为4的7号牧草,这种分配方案的总花费是12,为
所有方案中花费最少的。

HINT

Source

你可能感兴趣的:(USACO)