JZOJ 1246. 挑剔的美食家【平衡樹】


題目:

傳送門


題意:

nn頭牛和mm中牧草,每頭牛隻會喫比自己要求的更貴的、更鮮的的牧草,每頭牛喫的草都不相同
問要滿足所有牛所要的最小代價是多少


分析:

因爲有兩個限制,所以我們先以鮮嫩值排序,然後因爲要求滿足比花費大而又要儘可能的省錢,所以我們把花費放入平衡樹裏進行維護


代碼:

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#include<set>
#define LL long long
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
multiset<int> mu;
struct node{
	LL x,y;
}a[100005],b[100005];
bool cmp(node x,node y) {return x.y>y.y;}
int main()
{
	LL n=read(),m=read();
	for(LL i=1;i<=n;i++) a[i].x=read(),a[i].y=read(); 
	for(LL i=1;i<=m;i++) b[i].x=read(),b[i].y=read();
	sort(a+1,a+1+n,cmp);sort(b+1,b+1+m,cmp);
	LL l=1;
	multiset<int>::iterator it;
	LL ans=0;
	for(LL i=1;i<=n;i++)
	{
		while(a[i].y<=b[l].y&&l<=m) {mu.insert(b[l].x);l++;}
		it=mu.lower_bound(a[i].x);
		if(it==mu.end()) return !printf("-1");
		ans+=(*it);
		mu.erase(it);
	}
	cout<<ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章