bzoj1691/luogu2869 [USACO07DEC]挑剔的美食家 (STL::set)

Posted ressed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1691/luogu2869 [USACO07DEC]挑剔的美食家 (STL::set)相关的知识,希望对你有一定的参考价值。

给牛和草都按价格排序,然后贪心地把草给牛(就是尽量给满足价格的、要求的美味度最高但不超过这个草的美味度的牛)

这个可以用一个平衡树来维护,偷懒直接用multiset了

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define ll long long
 4 using namespace std;
 5 const int maxn=100010;
 6 
 7 inline ll rd(){
 8     ll x=0;char c=getchar();int neg=1;
 9     while(c<0||c>9){if(c==-) neg=-1;c=getchar();}
10     while(c>=0&&c<=9) x=x*10+c-0,c=getchar();
11     return x*neg;
12 }
13 
14 multiset<int> st;
15 int N,M;
16 pa cow[maxn],gra[maxn];
17 
18 int main(){
19     //freopen("1691.in","r",stdin);
20     int i,j,k;
21     N=rd();M=rd();
22     for(i=1;i<=N;i++){
23         cow[i].first=rd(),cow[i].second=rd();
24     }for(i=1;i<=M;i++){
25         gra[i].first=rd(),gra[i].second=rd();
26     }
27     sort(cow+1,cow+N+1);sort(gra+1,gra+M+1);
28     ll ans=0;int num=0;
29     for(i=1,j=1;i<=M&&num<=N;i++){
30         //printf("%d %d
",i,j);
31         for(;cow[j].first<=gra[i].first&&j<=N;j++){
32             st.insert(cow[j].second);
33         }
34         if(st.empty()||(*st.begin())>gra[i].second) continue;
35         multiset<int>::iterator it=st.upper_bound(gra[i].second);it--;
36         //printf("%d %d %d %d
",gra[i].first,gra[i].second,*it,it==st.end());
37         st.erase(it);ans+=gra[i].first;num++;
38     }
39     if(num==N) printf("%lld
",ans);
40     else printf("-1
");
41     return 0;
42 }

 

以上是关于bzoj1691/luogu2869 [USACO07DEC]挑剔的美食家 (STL::set)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&&bzoj1692[Usaco2007 Dec]队列变换*

bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草*&&bzoj3074[Usaco2013 Mar]The Cow Run*

bzoj1597USACO 2008 Mar土地购买

bzoj1601Usaco2008 Oct灌水

bzoj 1597: [Usaco2008 Mar]土地购买 2011-12-27

bzoj4525: [Usaco2016 Jan]Angry Cows