题目描述

传送门

题解

1.对牧草和奶牛都按价格排序。
2.从小到大枚举牧草,同时从小到大将A.money<=该牧草价格的牛扔进平衡树,平衡树中是按value来比较的。
3.在平衡树中查找一个最大的且<=B.value的牛,如果没找到,继续枚举,即返回2
4.找到了,那么我们把这个牛从平衡树中删除,答案加上当前这个牧草
枚举到最后如果还有牛没有匹配那么输出-1否则输出ans
正确性很显然。

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long
const int max_n=2e5+5;int n,m,A,B,root,sz;LL ans;
struct hp{int x,y;}a[max_n],b[max_n];
int f[max_n],ch[max_n][2],key[max_n],cnt[max_n];inline int cmp(hp a,hp b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
inline void clear(int x){f[x]=ch[x][0]=ch[x][1]=key[x]=0;
}
inline int get(int x){return ch[f[x]][1]==x;}
inline void rotate(int x){int old=f[x],oldf=f[old],which=get(x);ch[old][which]=ch[x][which^1];f[ch[old][which]]=old;ch[x][which^1]=old;f[old]=x;if (oldf) ch[oldf][ch[oldf][1]==old]=x;f[x]=oldf;
}
inline void splay(int x){for (int fa;(fa=f[x]);rotate(x))if (f[fa])rotate((get(x)==get(fa))?fa:x);root=x;
}
inline void insert(int x){if (!root){root=++sz;f[sz]=ch[sz][0]=ch[sz][1]=0;key[sz]=x;cnt[sz]=1;return;}int now=root,fa=0;while (1){if (x==key[now]){cnt[now]++;splay(now);return;}fa=now;now=ch[now][key[now]<x];if (!now){++sz;f[sz]=fa;ch[sz][0]=ch[sz][1]=0;key[sz]=x;cnt[sz]=1;ch[fa][key[fa]<x]=sz;splay(sz);return;}}
}
inline int find(int x){int now=root;while (1){if (x<key[now]) now=ch[now][0];else if (x==key[now]) return now;else if (x>key[now]) now=ch[now][1];}
}
inline int pre(){if (cnt[root]>1) return root;int now=ch[root][0];while (ch[now][1]) now=ch[now][1];return now;
}
inline void del(int x){splay(x);if (cnt[root]>1){cnt[root]--;return;}if (!ch[root][0]&&!ch[root][1]){clear(root);root=0;return;}if (!ch[root][0]){int oldroot=root;root=ch[oldroot][1];f[root]=0;clear(oldroot);return;}if (!ch[root][1]){int oldroot=root;root=ch[oldroot][0];f[root]=0;clear(oldroot);return;}int leftbig=pre(),oldroot=root;splay(leftbig);ch[root][1]=ch[oldroot][1];f[ch[root][1]]=root;clear(oldroot);
}
int main(){scanf("%d%d",&n,&m);if (m<n){puts("-1");return 0;}for (int i=1;i<=n;++i) scanf("%d%d",&a[i].x,&a[i].y);for (int i=1;i<=m;++i) scanf("%d%d",&b[i].x,&b[i].y);sort(a+1,a+n+1,cmp); sort(b+1,b+m+1,cmp);A=1,B=1;while (B<=m){if (A>n&&!root) break;while (a[A].x<=b[B].x&&A<=n) insert(a[A].y),A++;insert(b[B].y);int p=pre();int q=find(b[B].y);del(q);if (!p){B++;continue;}del(p);ans+=(LL)b[B].x;B++;}if (root||A<=n) puts("-1");else printf("%lld",ans);
}

总结

找第一个小于它的插入之后找前驱吧,刚开始随便找的不知道为什么出错。

[BZOJ1691][Usaco2007 Dec]挑剔的美食家(贪心+splay)相关推荐

  1. bzoj1691 [Usaco2007 Dec]挑剔的美食家

    Description 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了.现在,Farmer John不得不去牧草专供商那里 ...

  2. bzoj 1691: [Usaco2007 Dec]挑剔的美食家(multiset贪心)

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 879  Solved: 445 [Submit] ...

  3. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家( 平衡树 )

    按鲜嫩程度排个序, 从大到小处理, 用平衡树维护价值 ---------------------------------------------------------------------- #i ...

  4. bzoj 1691: [Usaco2007 Dec]挑剔的美食家

    Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 621  Solved: 280 [Submit][Status][Discuss] Descriptio ...

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

    给牛和草都按价格排序,然后贪心地把草给牛(就是尽量给满足价格的.要求的美味度最高但不超过这个草的美味度的牛) 这个可以用一个平衡树来维护,偷懒直接用multiset了 1 #include<bi ...

  6. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )

    数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...

  7. bzoj 1640 bzoj 1692: [Usaco2007 Dec]队列变换(后缀数组)

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1756  Solved: 737 [Submit][ ...

  8. [BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

    1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1730  Solved ...

  9. bzoj1625[Usaco2007 Dec]宝石手镯*

    bzoj1625[Usaco2007 Dec]宝石手镯 题意: n个宝石,每个有重量和价值,要挂一些在手镯上,求满足总质量不超过m的最大总价值.n≤3402,m≤12880 题解: 01背包. 代码: ...

最新文章

  1. Oracle-计算岁数
  2. VS2010安装帮助文档出现错误
  3. 一张图告诉你为什么是服务网关
  4. 【BZOJ 1098】办公楼(补图连通块个数,Bfs)
  5. 在Ubuntu 16.04 安装python3.6 环境并设置为默认
  6. [Unity] 战斗系统学习 11:Buff 框架 1
  7. LeetCode 26. Remove Duplicates from Sorted Array
  8. (转)Spring的概述
  9. [VBA]工作需求,写了段VBA。EXCEL的效率很差
  10. 最新版本启动HBuilderX.exe时,被联想mcafee杀毒软件删除的解决方法
  11. 联想智能云教室安win7_用“联想智能云教室”部署系统完成后,操作卡顿?
  12. 统一监控报警平台架构设计思路
  13. 自定义容器实现类似Windows屏保功能
  14. win10搜索框不能用的解决方案
  15. R语言实战(第二版)第七章-基本统计分析
  16. 从零开始的种田生活-Unity游戏开发
  17. 转载:Network 之三 Ethernet(以太网)物理介质(10Base、100Base-T、100Base-TX等)介绍
  18. android+后台日志开启,Windows 下查看Android手机日志(LogView使用)
  19. RTCSD团队第三组第二周进度报告
  20. 无人驾驶11:行为规划

热门文章

  1. Python 学习目标
  2. MFC CPropertySheet控件
  3. 怎样使用CPropertyPage类和CPropertySheet类创建属性表
  4. java 日程日历_dhtmlxscheduler日历日程控件使用
  5. SpringBoot拦截器失效问题excludePathPatterns失效问题
  6. c++ 常用STL 之unordered_map
  7. 如何用xp系统做服务器,xp系统如何做远程服务器呢
  8. c++rpg黑框游戏_RPG游戏 C++源码 文字RPG游戏
  9. c语言迷宫代码大全,C语言---迷宫游戏 代码
  10. ibm服务器如何查硬件支持型号,ibm服务器硬件安装步骤是怎样