1. 程式人生 > >bzoj1691/luogu2869 [USACO07DEC]挑剔的美食家 (STL::set)

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

usaco tin multiset 維護 () define stl freopen bound

給牛和草都按價格排序,然後貪心地把草給牛(就是盡量給滿足價格的、要求的美味度最高但不超過這個草的美味度的牛)

這個可以用一個平衡樹來維護,偷懶直接用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 }

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