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\n",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\n",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\n",ans);
40     else printf("-1\n");
41     return 0;
42 }

 

posted @ 2018-09-14 20:38  Ressed  阅读(162)  评论(0编辑  收藏  举报