【题目大意】

有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度。每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值。每种牧草只会被一头牛选择。问最少要多少钱?

【思路】

显然的贪心,把奶牛和牧草都按照鲜嫩度由大到小排序,对于每奶牛把鲜嫩度大于它的都扔进treap,然后找出后继。

不过注意后继的概念是大于它且最小的,然而我们这里是可以等于的,所以应该是找cow[i].fresh-1的后继,注意一下……

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int MAXN=+;
const int INF=0x7fffffff;
struct node
{
int fresh,price;
bool operator < (const node &x) const
{
return (fresh>x.fresh);//注意是由大到小排序
}
}cow[MAXN],grass[MAXN];
struct treap
{
int key,cnt,priority;
treap* lson;
treap* rson;
treap()
{
cnt=;
priority=rand();
lson=rson=NULL;
}
};
treap* root=NULL;
int n,m; void RightRotate(treap* &rt)
{
treap* tmp=rt->lson;
rt->lson=tmp->rson;
tmp->rson=rt;
rt=tmp;
} void LeftRotate(treap* &rt)
{
treap* tmp=rt->rson;
rt->rson=tmp->lson;
tmp->lson=rt;
rt=tmp;
} void insert(treap* &rt,int x)
{
if (rt==NULL)
{
rt=new treap;//不要忘记了新建
rt->key=x;
}
else if (rt->key==x) rt->cnt++;
else
{
if (rt->key>x)
{
insert(rt->lson,x);
if (rt->lson->priority>rt->priority) RightRotate(rt);
}
if (rt->key<x)
{
insert(rt->rson,x);
if (rt->rson->priority>rt->priority) LeftRotate(rt);
}
}
} void del(treap* &rt,int x)
{
if (rt->key==x)
{
if (rt->cnt>) rt->cnt--;
else
{
treap* tmp=rt;
if (rt->lson==NULL)
{
rt=rt->rson;
delete tmp;
}
else if (rt->rson==NULL)
{
rt=rt->lson;
delete tmp;
}
else
{
if (rt->lson->priority>rt->rson->priority) RightRotate(rt),del(rt->rson,x);
else LeftRotate(rt),del(rt->lson,x);
}
}
}
else
{
if (x<rt->key) del(rt->lson,x);
else del(rt->rson,x);
}
} int suc(treap* &rt,int x)
{
int ans=INF;
treap* tmp=rt;
while (tmp)
{
if (tmp->key>x)
{
ans=min(ans,tmp->key);
tmp=tmp->lson;
}
else tmp=tmp->rson;
}
return ans;
} void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d%d",&cow[i].price,&cow[i].fresh);
for (int i=;i<=m;i++) scanf("%d%d",&grass[i].price,&grass[i].fresh);
sort(cow+,cow+n+);
sort(grass+,grass+m+);
} ll solve()
{
int j=;
ll ans=;
for (int i=;i<=n;i++)
{
while (grass[j].fresh>=cow[i].fresh && j<=m)
{
insert(root,grass[j].price);//这里一开始把j打成i了
j++;
}
int find=suc(root,cow[i].price-);//注意由于这里是不低于,也就是≥,并不是取cow[i].price的后继,而是cow[i].price-1的
if (find==INF) return(-);
else
{
ans+=(ll)find;
del(root,find);
}
}
return ans;
} int main()
{
init();
printf("%lld",solve());
return ;
}

【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家的更多相关文章

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

    [BZOJ1691][Usaco2007 Dec]挑剔的美食家 试题描述 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了. ...

  2. bzoj1691[Usaco2007 Dec]挑剔的美食家 平衡树treap

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

  3. 【贪心】【二维偏序】【权值分块】bzoj1691 [Usaco2007 Dec]挑剔的美食家

    既然题目中的要求满足二维偏序,那么我们很自然地想到将所有东西(草和牛)都读进来之后,对一维(美味度)排序,然后在另一维(价值)中取当前最小的. 于是,Splay.mutiset.权值分块什么的都支持查 ...

  4. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 391[Submit][S ...

  5. BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心

    BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心 题意: 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返 ...

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

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

  7. BZOJ1691: [Usaco2007 Dec]挑剔的美食家

    传送门: 一句话题解:贪心+treap 好几天前刚学的treap,然后真到了考treap又写不出来,这么辣鸡还搞什么OI 先按$A_i$递减排序,然后把$C_i$也递减排序,然后用一个指针指向$M$序 ...

  8. 「BZOJ1691」[Usaco2007 Dec] 挑剔的美食家 (Treap)

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

  9. 【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家(set+贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1691 懒得打平衡树了.... 而且multiset是很快的... 排到了rank1 T_T 贪心就是 ...

随机推荐

  1. c++都忘记了,看了看那本发黄的C++primer,还是要去翻下了

    char *s="string"和char s[]="string"的区别 void main() { char* pStr1 = "Hello!&q ...

  2. 洛谷 1.5.1 Number Triangles 数字金字塔

    Description 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 ...

  3. 从urllib和urllib2基础到一个简单抓取网页图片的小爬虫

    urllib最常用的两大功能(个人理解urllib用于辅助urllib2) 1.urllib.urlopen() 2. urllib.urlencode()   #适当的编码,可用于后面的post提交 ...

  4. HDU 1394 Minimum Inversion Number (树状数组)

    题目链接 Problem Description The inversion number of a given number sequence a1, a2, ..., an is the numb ...

  5. PowerPC简单了解

    PowerPC相对于ARM优势: Powerpc芯片凭借其出色的性能和高度整合和技术先进特性在网络通信应用,工业控制应用,家用数字化,网络存储领域,军工领域,电力系统控制等都具有非常广泛的应用.由于P ...

  6. 大数据系列之kafka监控kafkaoffsetmonitor安装

    1.下载kafkaoffsetmonitor的jar包,可以到github搜索kafkaoffsetmonitor,第一个就是,里面可以下载编译好了的包. KafkaOffsetMonitor-ass ...

  7. Ubuntu16.04安装记

    Ubuntu16.04安装记 基本信息: 华硕笔记本 Windows 10 家庭版 处理器:Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2.71GHz 已安装的内 ...

  8. ie7浏览器兼容问题

    win10 下如何调试Ie 网上有很多ie的测试工具,包括ms自己出的有,但是如果是win10系统,压根不需要这些玩意. win10 浏览器edge虽然是重写过的,但是win10并没有完全抛弃ie,可 ...

  9. css3动画详解

    一.Keyframes介绍: Keyframes被称为关键帧,其类似于Flash中的关键帧.在CSS3中其主要以“@keyframes”开头,后面紧跟着是动画名称加上一对花括号“{…}”,括号中就是一 ...

  10. BeanUtils简化数据封装

    BeanUtils主要用来封装JavaBean的. 1.什么是JavaBean JavaBean指的是标准的类. 要求: 1. 类必须被public修饰2. 必须提供空参的构造器3. 成员变量必须使用 ...