~~~题面~~~

题解:

  首先观察题面,直觉上对于一头奶牛,肯定要给它配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的更多相关文章

  1. P2869 [USACO07DEC]美食的食草动物Gourmet Grazers

    P2869 [USACO07DEC]美食的食草动物Gourmet Grazers 题目:约翰的奶牛对食物越来越挑剔了.现在,商店有M 份牧草可供出售,奶牛食量很大,每份牧草仅能供一头奶牛食用.第i 份 ...

  2. LG_2869_[USACO07DEC]美食的食草动物Gourmet Grazers

    题目描述 Like so many others, the cows have developed very haughty tastes and will no longer graze on ju ...

  3. luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers

    先满足挑剔的 #include <algorithm> #include <iostream> #include <cstdlib> #include <cs ...

  4. Luogu2869 [USACO07DEC]美食的食草动物Gourmet Grazers (贪心,二分,数据结构优化)

    贪心 考场上因无优化与卡常T掉的\(n \log(n)\) //#include <iostream> #include <cstdio> #include <cstri ...

  5. POJ3622 Gourmet Grazers(FHQ Treap)

    Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2363   Accepted: 881 Description Like s ...

  6. POJ 3622 Gourmet Grazers(贪心)

    [题目链接] http://poj.org/problem?id=3622 [题目大意] 给出一些物品拥有两个属性值,价格和精美程度 给出一些需求表示要求获得的物品两个属性值的两种属性下界, 一个物品 ...

  7. luogu 2869 挑剔的美食家

    Gourmet Grazers 传送门 题目大意 约翰的奶牛对食物越来越挑剔了.现在,商店有\(M\) 份牧草可供出售,奶牛食量很大,每份牧草仅能供一头奶牛食用.第\(i\) 份牧草的价格为\(P_i ...

  8. POJ1058 The Gourmet Club

    题目来源:http://poj.org/problem?id=1058 题目大意:ACM城的美食俱乐部有16位成员.他们连续了当地的法国餐厅Chatrau Java来安排连续5天的晚餐.晚餐时他们每4 ...

  9. Hawk 1.2 快速入门2 (大众点评18万美食数据)

    本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需要编程,还能自动 ...

随机推荐

  1. PHP队列之理论篇

    定义: 特殊的线性表.       特点: 1.先进先出:连结性. 2.作为一种特殊性的表,主要是在表前端进行删除操作,我们称删除的端为对头(front):只能在表的后端进行插入操作,我们称之为称插入 ...

  2. 用友二次开发之科脉TOT3凭证接口

    按客户的要求,根据科脉导出的数据,开发一个工具,将凭证导入T3 这个科目导出的凭证格式. 选择账套登陆,你没看错,这个是我开发的登陆界面. 选择接口文件. 软件自动进数据分类,你可以看到数据了.但只是 ...

  3. CRC校验8

    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并 ...

  4. scrapy框架爬取笔趣阁完整版

    继续上一篇,这一次的爬取了小说内容 pipelines.py import csv class ScrapytestPipeline(object): # 爬虫文件中提取数据的方法每yield一次it ...

  5. Python学习手册之Python异常和文件

    在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9963 ...

  6. array_x

    import java.util.*; public class array_x { public static void main(String args[]) { int a[][]={{2,4, ...

  7. 安装 Node.js v8.0 生产环境

    步骤://center os 上把apt-get换成yum 第一步:进入服务器升级工具包 sudo apt-get update 第二步:安装git  sudo apt-get install git ...

  8. linux execl()函数

    关于execl()函数族的用法不在赘述,其他博主介绍的很详细.下面说下作者在使用该函数时所犯的错误: 作者想通过使用execl()函数在子进程中调用其他函数,起初楼主是 这样用的: if((a = e ...

  9. ORB-SLAM 代码笔记(三)tracking原理

    ORB视觉里程计主体在tracking线程中

  10. How to set pycharm configure for remoting development

    配置pycharm远程连接,点击pycharm的tools,选择deployment选项,选择configuration. 2 点击左侧的加号按钮,新增一个连接,取个名字,根据个人配置选择协议,这里选 ...