[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分钟内完成爬虫的设计,基本不需要编程,还能自动 ...
随机推荐
- 在python中安装basemap
在python中安装basemap 1. 确保python环境安装完毕且已配置好环境变量 2. 安装geos: pip install geos 3. 下载.whl文件: (1)pyproj‑1.9. ...
- nginx配置SSL证书/强制跳转与非强制跳转
支持强制跳转HTTPS server { listen 80; server_name www.test.com; rewrite ^(.*)$ https://${server_name}$1 pe ...
- 怎么用Python Flask模板jinja2在网页上打印显示16进制数?
问题:Python列表(或者字典等)数据本身是10进制,现在需要以16进制输出显示在网页上 解决: Python Flask框架中 模板jinja2的If 表达式和过滤器 假设我有一个字典index, ...
- python学习之字符串常用方法和格式化字符串
Python中的字符串同样适用标准的序列操作(索引,分片,乘法,成员判断,求长度,取最小值和最大值),但因为字符串是不可变的,因此字符串不支持分片赋值. s='http://www.baidu.com ...
- unity独立游戏开发日记2018/09/27
今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...
- mysql 函数以及操作总结
1. 拼接 concat(参数1,参数2,.. ,参数) 实现将多个字符串拼接到一起 要批量修改一个字段值 字段值又是复杂的sql 计算得来 通过查询字段值 和 修改的条件fundId(这是 ...
- Vm-Ubuntu下配置Qt开发环境
在昨天的Ubuntu换降下,安装Qt发现编译的时候是缺少opengl的 奈何找了好多方式都无法安装opengl 今天看到另一位大神写的,才发下自己找的还是有问题 大神帖子网址:http://blog. ...
- Word2Vec词向量(一)
一.词向量基础(一)来源背景 word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系.虽然源码是 ...
- 编译 TensorFlow 的 C/C++ 接口
TensorFlow 的 Python 接口由于其方便性和实用性而大受欢迎,但实际应用中我们可能还需要其它编程语言的接口,本文将介绍如何编译 TensorFlow 的 C/C++ 接口. 安装环境: ...
- AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...