[USACO07DEC]美食的食草动物Gourmet Grazers
题解:
首先观察题面,直觉上对于一头奶牛,肯定要给它配pi和qi符合条件的草中两者尽量低的草,以节省下好草给高要求的牛。
实际上这是对的,但观察到两者尽量低这个条件并不明确,无法用于判断,因此要考虑一些其他的方法。
首先我们把牛和草都放在一个数组里,然后按照口感给它们排序。这样对于任意一头牛而言,口感符合要求的就只有在它前面的草。
排完序后,我们只需要在任意一头牛之前找到一个还没有被分配的,价格最低的符合要求的草即可。
为什么这样就不用考虑口感尽量低这个条件了呢?
因为对于后面的任意一只牛而言,在它前面的草的口感值大于要求,因此不管前面的牛怎么选择,剩下的草都是符合口感要求的,因此此时再去对口感值做限制就毫无意义了。
所以我们只需要在它前面的草中筛选出大于价格要求的,最便宜的草即可。
如果没有大于价格要求这一条件,显然我们可以用堆,但是由于这个条件限制,堆无法实现。
因此我们可以考虑用平衡树来实现它。
用STL是最简单的,当然也可以自己手写。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 220000
#define LL long long int n, m, cnt;
LL ans; struct node{
int cost, taste;
bool who;
}p[AC]; struct splay_tree{
int root, tot, go;
int son[AC][], father[AC], cnt[AC], Size[AC], val[AC]; inline void update(int x)
{
Size[x] = Size[son[x][]] + Size[son[x][]] + cnt[x];
} void rotate(int x)
{
int y = father[x];
int z = father[y];
int k = (son[y][] == x);
father[x] = z;
son[z][son[z][] == y] = x;
father[son[x][k ^ ]] = y;
son[y][k] = son[x][k ^ ];
father[y] = x;
son[x][k ^ ] = y;
update(y), update(x);
} void splay(int x, int goal)
{
if(!x) return ;
while(father[x] != goal)
{
int y = father[x], z = father[y];
if(z != goal)
(son[y][] == x) ^ (son[z][] == y) ? rotate(x) : rotate(y);
rotate(x);
}
update(x);
if(!goal) root = x;
} void find(int x, int w)//找到这个点的前驱,并splay到root
{
if(!x) return ;
if(val[x] >= w)
{
if(!go || val[x] < val[go]) go = x;
find(son[x][], w);
}
else find(son[x][], w);
} int found(int k)//找根的前驱后继
{
int now = root;
now = son[now][k];
while(son[now][k ^ ]) now = son[now][k ^ ];
return now;
} void get(int x)
{
go = , find(root, x);
if(!go)
{
printf("-1\n");
exit();
}
splay(go, );
ans += val[go];
if(cnt[go] > )
{
--cnt[go];
update(go);
return ;
}
int before = found(), behind = found();
if(!before && !behind) root = ;
else if(!before) root = son[root][], father[root] = ;
else if(!behind) root = son[root][], father[root] = ;
else splay(before, ), splay(behind, before);
son[behind][] = ;
} void insert(int x)//插入一个点
{
int now = root, fa = ;
while(now && val[now] != x)
{
fa = now;
now = son[now][x > val[now]];
}
if(now) cnt[now] ++;
else
{
now = ++ tot;
if(fa) son[fa][x > val[fa]] = now;
father[now] = fa;
val[now] = x;
cnt[now] = Size[now] = ;
if(fa) update(fa);
}
splay(now, );
}
}s; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline bool cmp(node a, node b)
{
if(a.taste != b.taste) return a.taste > b.taste;
else return a.cost > b.cost;
} void pre()
{
int a, b;
n = read(), m = read();
for(R i = ; i <= n; i ++)
{
a = read(), b = read();
p[++cnt] = (node){a, b, };
}
for(R i = ; i <= m; i ++)
{
a = read(), b = read();
p[++cnt] = (node){a, b, };
}
sort(p + , p + cnt + , cmp);
// for(R i = 1; i <= cnt; i ++)
// printf("%d %d %d\n", p[i].cost, p[i].taste, p[i].who);
} void work()
{
for(R i = ; i <= cnt; i ++)
if(!p[i].who) s.get(p[i].cost);
else s.insert(p[i].cost);
printf("%lld\n", ans);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}
[USACO07DEC]美食的食草动物Gourmet Grazers的更多相关文章
- P2869 [USACO07DEC]美食的食草动物Gourmet Grazers
P2869 [USACO07DEC]美食的食草动物Gourmet Grazers 题目:约翰的奶牛对食物越来越挑剔了.现在,商店有M 份牧草可供出售,奶牛食量很大,每份牧草仅能供一头奶牛食用.第i 份 ...
- LG_2869_[USACO07DEC]美食的食草动物Gourmet Grazers
题目描述 Like so many others, the cows have developed very haughty tastes and will no longer graze on ju ...
- luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers
先满足挑剔的 #include <algorithm> #include <iostream> #include <cstdlib> #include <cs ...
- Luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers (贪心,二分,数据结构优化)
贪心 考场上因无优化与卡常T掉的\(n \log(n)\) //#include <iostream> #include <cstdio> #include <cstri ...
- POJ3622 Gourmet Grazers(FHQ Treap)
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2363 Accepted: 881 Description Like s ...
- POJ 3622 Gourmet Grazers(贪心)
[题目链接] http://poj.org/problem?id=3622 [题目大意] 给出一些物品拥有两个属性值,价格和精美程度 给出一些需求表示要求获得的物品两个属性值的两种属性下界, 一个物品 ...
- luogu 2869 挑剔的美食家
Gourmet Grazers 传送门 题目大意 约翰的奶牛对食物越来越挑剔了.现在,商店有\(M\) 份牧草可供出售,奶牛食量很大,每份牧草仅能供一头奶牛食用.第\(i\) 份牧草的价格为\(P_i ...
- POJ1058 The Gourmet Club
题目来源:http://poj.org/problem?id=1058 题目大意:ACM城的美食俱乐部有16位成员.他们连续了当地的法国餐厅Chatrau Java来安排连续5天的晚餐.晚餐时他们每4 ...
- Hawk 1.2 快速入门2 (大众点评18万美食数据)
本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需要编程,还能自动 ...
随机推荐
- js实现前端的搜索历史记录
最近在对接前台页面(WEB端)时,产品要求需记录下客户的搜索记录,我们是前后台完全分离的项目,根本不能保存的session域中,没办法,虽然作为后台开发,遇到需求就自己研究了一通,先看一下最终效果图, ...
- ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)
因项目没有PC站所以没有写电脑网站支付. Pay.php支付控制器 <?php // +----------------------------------------------------- ...
- 为什么不早点使用 Git...
教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013739628770 ...
- SGU 495
#include<bits/stdc++.h> using namespace std; #define ll long long ; ; int n,m; double dp[N]; / ...
- loj136 (最小瓶颈路,多次询问)
题目描述 给定一个包含 n nn 个节点和 m mm 条边的图,每条边有一个权值.你的任务是回答 k kk 个询问,每个询问包含两个正整数 s ss 和 t tt 表示起点和终点,要求寻找从 s ss ...
- Prometheus 普罗米修斯监控
周末在家无聊 看新闻 看到关于监控的东西 拿来玩玩 试一下 感觉还蛮有意思 特此记录一下 这里只介绍客户端的配置 1:首先在POM中添加依赖 <dependency> <groupI ...
- spring+apache dbcp +oracle 连接池配置以及优化
特此记录 <!-- 数据源配置, 使用应用中的DBCP数据库连接池 --> <bean id="dataSource" class="org.apach ...
- linux备忘录-系统服务daemon
服务(daemon)及其分类 Linux中的服务被称为daemon(daemon是守护神,恶鬼的意思哦).这些daemon会常驻在内存当中,从而对我们的系统和任务等进行一些辅助性的工作.实际上,dae ...
- 【转】 The user specified as a definer ('root'@'') does not exist when using LOCK TALBE
在linux下,用mysql的导出语句: mysqldump -u root -pPasswd table >/home/lsf/test.sql 出现了 Got error: 1449: Th ...
- Java 访问权限控制 小结
总所周知,Java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的. 访问权限控制的等级,从最大权限到最小权限依次为:public.protected.包访问权限( ...