[BZOJ 1691] 挑剔的美食家
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=1691
[算法]
不难想到如下算法 :
将所有牛和牧草按鲜嫩程度降序排序,按顺序扫描,如果扫描到的是牧草,则将牧草的美味程度加入一个集合,否则,将答案加上比这头牛的期望价格大的牧草中价格最小的
这个贪心策略的正确性是显然的,具体实现时,我们可以维护一棵平衡树,这棵平衡树支持 : 插入/删除一个数,查询一个数的后继,我们可以方便地使用STL-set完成这个任务,为了练习平衡树,笔者使用的是伸展树
时间复杂度 : O(Nlog(N))
[代码]
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010 struct info
{
long long x,y;
int opt;
} a[MAXN << ]; int i,n,m;
long long ans,tmp; template <typename T> inline void read(T &x)
{
long long f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar())
{
if (c == '-') f = -f;
}
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
struct Splay
{
int root,total;
struct Node
{
int fa;
long long val;
int cnt;
int son[];
} Tree[MAXN << ];
inline bool get(int x)
{
return Tree[Tree[x].fa].son[] == x;
}
inline void rotate(int x)
{
int f = Tree[x].fa,g = Tree[f].fa;
int tmpx = get(x),tmpf = get(f);
if (!f) return;
Tree[f].son[tmpx] = Tree[x].son[tmpx ^ ];
if (Tree[x].son[tmpx ^ ]) Tree[Tree[x].son[tmpx ^ ]].fa = f;
Tree[x].son[tmpx ^ ] = f;
Tree[f].fa = x;
Tree[x].fa = g;
if (g) Tree[g].son[tmpf] = x;
}
inline void splay(int x)
{
int fa;
for (fa = Tree[x].fa; (fa = Tree[x].fa); rotate(x))
rotate((get(fa) == get(x)) ? fa : x);
root = x;
}
inline int insert(long long x)
{
bool tmp;
if (!root)
{
root = ++total;
Tree[root].fa = ;
Tree[root].son[] = Tree[root].son[] = ;
Tree[root].cnt = ;
Tree[root].val = x;
return total;
}
int now = root;
while (now > )
{
if (Tree[now].val == x)
{
Tree[now].cnt++;
splay(now);
return now;
}
tmp = x > Tree[now].val;
if (!Tree[now].son[tmp])
{
Tree[now].son[tmp] = ++total;
Tree[total].fa = now;
Tree[total].val = x;
Tree[total].cnt = ;
Tree[total].son[] = Tree[total].son[] = ;
splay(total);
return total;
} else now = Tree[now].son[tmp];
}
}
inline int get_pos(int x)
{
int now = x;
while (Tree[now].son[]) now = Tree[now].son[];
return now;
}
inline void join(int x,int y)
{
int p = get_pos(x);
splay(p);
Tree[p].son[] = y;
Tree[y].fa = p;
}
inline void erase(int x)
{
Tree[x].cnt--;
if (Tree[x].cnt > ) return;
if (!Tree[x].son[] && !Tree[x].son[])
{
root = ;
return;
}
if (!Tree[x].son[])
{
root = Tree[x].son[];
Tree[root].fa = ;
return;
}
if (!Tree[x].son[])
{
root = Tree[x].son[];
Tree[root].fa = ;
return;
}
join(Tree[x].son[],Tree[x].son[]);
}
inline long long query(long long x)
{
int p = insert(x);
int now = p;
if (Tree[p].cnt > )
{
erase(p);
erase(p);
return x;
}
now = Tree[p].son[];
while (Tree[now].son[]) now = Tree[now].son[];
erase(p);
long long ret = Tree[now].val;
splay(now);
erase(now);
return ret;
}
} T;
inline bool cmp(info a,info b)
{
if (a.y != b.y) return a.y > b.y;
else return a.opt > b.opt;
} int main()
{ read(n); read(m);
for (i = ; i <= n; i++)
{
read(a[i].x);
read(a[i].y);
a[i].opt = ;
}
for (i = ; i <= m; i++)
{
read(a[n + i].x);
read(a[n + i].y);
a[n + i].opt = ;
}
sort(a + ,a + (n + m) + ,cmp);
for (i = ; i <= n + m; i++)
{
if (a[i].opt == )
{
tmp = T.query(a[i].x);
if (tmp != -)
{
ans += tmp;
continue;
}
printf("-1\n");
return ;
} else T.insert(a[i].x);
}
printf("%lld\n",ans); return ; }
[BZOJ 1691] 挑剔的美食家的更多相关文章
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家( 平衡树 )
按鲜嫩程度排个序, 从大到小处理, 用平衡树维护价值 ---------------------------------------------------------------------- #i ...
- [BZOJ1691][Usaco2007 Dec]挑剔的美食家
[BZOJ1691][Usaco2007 Dec]挑剔的美食家 试题描述 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了. ...
- BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心
BZOJ_1691_[Usaco2007 Dec]挑剔的美食家_贪心 题意: 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返 ...
- 51nod 挑剔的美食家
挑剔的美食家 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一 ...
- 【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家(set+贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1691 懒得打平衡树了.... 而且multiset是很快的... 排到了rank1 T_T 贪心就是 ...
- bzoj 1691: [Usaco2007 Dec]挑剔的美食家
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 621 Solved: 280[Submit][Status][Discuss] Description ...
- BZOJ 1691 [Usaco2007 Dec]挑剔的美食家 multiset_排序_贪心
Description 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了.现在,Farmer John不得不去牧草专供商那里 ...
- 【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家
[算法]扫描线+平衡树(set) [题解]很明显的二维偏序数点,排序后扫描线,现加点后查询答案. 则问题转化为一维偏序,显然贪心找第一个比当前大的最优,所以用平衡树维护. 记得开multiset!!! ...
随机推荐
- Redis系列(二)--分布式锁、分布式ID简单实现及思路
分布式锁: Redis可以实现分布式锁,只是讨论Redis的实现思路,而真的实现分布式锁,Zookeeper更加可靠 为什么使用分布式锁: 单机环境下只存在多线程,通过同步操作就可以实现对并发环境的安 ...
- 官方安装docker-ce步骤
这里是Centos7安装方式 安装依赖包 $ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 添加Docker ...
- vue的自定义指令控制菜单权限
用户登录后,选择子节点,节点中含有多个菜单,可以根据后台返回的权限数据进行权限控制 在vue上挂载自定义指令方法,根据后台返回权限移除相应节点 import Cookies from "js ...
- TWaver3D特效之高光反射
前篇我们介绍了TWaver 3D的环境映射特效,下面我们接着给大家分享高光反射特效.高光反射定义了物体上的某一区域比其他地方更反光.在高光反射的贴图中,黑色区域的反射率为0(完全不反光),白色区域的反 ...
- relax 网站
1. Calm 网站链接:http://www.calm.com/ 这个网站就像它的名字一样“平和”,网站的设计是通过自然图片(阳光下的暖流.流淌的消息等)与缓缓的音乐相结合,帮你在短时间内即可放松下 ...
- HTML5网页如何调用浏览器APP的微信分享功能?
if (/AppleWebKit.*Mobile/i.test(navigator.userAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Al ...
- poj3061 Subsequence【尺取法】
Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...
- UVA-127 "Accordian" Patience(模拟)
题目: 把52张牌从左到右排好,每张牌自成一个牌堆.当某张牌与它左边那张牌或者左边第三张牌匹配时(花色或者点数相同)时,就把这张牌移到那张牌上面. 移动之后还要查看是否可以进行其他移动.只有位于牌堆顶 ...
- zend studio 12.5.1 window 安装并设置笔记
下载百度云上的安装包-----------------------------------------------安装时,解决window 10的权限问题 安装完成后的设置设置字体window=> ...
- 搭建Nginx服务
Nginx 是一个高性能的 http 和反向代理服务器,也是一个 IMAP/POP3/SMPT 服务器. Nginx 是由 logor Sysoev 为俄罗斯访问第二的 Ranbler.ru 站点开发 ...