[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高级. 01 复习JS基础
1. JavaScript 包含: ____, ____, 和 ____. 2. JavaScript 的基本类型有 ____, ____, 和 ____. 3. JavaScript 的复合类型有 ...
- C# 多条件拼接sql
#region 多条件搜索时,使用List集合来拼接条件(拼接Sql) StringBuilder sql = new StringBuilder("select * from PhoneN ...
- HyperLedger Fabric 1.4 交易流程(6.3)
区块链最主要的特性之一是去中心化,没有了中心机构的集中处理,为了达成数据的一致性,就需要网络中全民参与管理,并以某种方法达成共识,所以区块链的交易流程也就是共识的过程. 在Fabric中, ...
- Blah数集
Blah数集 描述 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素: (2)如果x在集合Ba中,则2x+1 ...
- ABAP CDS ON HANA-(7)CDSビューでの集約
Aggregate expression in CDS View An aggregate expression calculates a single value from an operand o ...
- linux io 学习笔记(02)---条件变量,管道,信号
条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t 定 ...
- 初步学习pg_control文件之十三
接前文,初步学习pg_control文件之十二 看这个: * backupStartPoint is the redo pointer of the backup start checkpoint, ...
- Python的入坑之路(1)
(故事背景:由于涉及到机密的原因,暂时不方便透露,待后期再写.) 国庆长假过完之后,回来上班第二天下午,Boss跟龙哥把我叫了出去,问我要不要转人工智能.一脸懵逼的我,带着一脸懵逼听Boss说人工智能 ...
- 记一次艰难的CTP调试
一个atmel,mxt540e的CTP触摸屏. 中断配置为下降沿,输入上拉. 总是只能触发一次中断,中断脚就一直低电平,无法拉高.这只是表面现象 不停找底层I2C驱动,改代码,没用.要靠波形来说话 ...
- unresolved symbol @__security_check_cookie 解决方法
ntstrsafe.lib(output.obj) : error LNK2019: unresolved external symbol @__security_check_cookie@4 ref ...