[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!!! ...
随机推荐
- 梦想CAD控件打印相关
一.打印设置 在顶部快速访问工具栏单击打印按钮或者直接输入PLOT命令或者点击打印控制的打印设置按钮打开打印对话框.c#代码实现如下: //打印设置 private void Print1() { ...
- java string与byte互转
1.string 转 byte[]byte[] midbytes=isoString.getBytes("UTF8");//为UTF8编码byte[] isoret = srt2. ...
- Luogu P1991 无线通讯网
P1991 无线通讯网 题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫 ...
- [Algorithm] 11. Linked List Cycle
Description Given a linked list, determine if it has a cycle in it. To represent a cycle in the give ...
- Go:条件语句、循环语句
一.条件语句 package main import ( "fmt" "io/ioutil" ) // if的条件不需要括号 func xx(i int) in ...
- Docker从入门到实践
一般说来 SPA 的项目我们只要启一个静态文件 Server 就可以了,但是针对传统项目就不一样了,一个项目会依赖很多服务端程序.之前我们的开发模式是在一台开发机上部署开发环境,所有人都在这台开发机上 ...
- 哈希表模板(Hash set)
省选前最后的复(chui si)习(zheng zha). 上模板吧 namespace Hash_Table{ #define inf ~0U>>1 #define MaxN 10010 ...
- ansible plugins简介
ansible插件是增强ansible的核心功能的代码片段,ansible使用插件架构来实现丰富,灵活和可扩展的功能集. Ansible提供了许多方便的插件,您可以轻松编写自己的插件. 下边简单介绍A ...
- 根据View找控制器
- (UIViewController*)viewController { for (UIView* next = [self superview]; next; next = next.superv ...
- 非常适合新手的jq/zepto源码分析08---ajax的封装
1.现在看看对JSONP的封装 $.ajaxJSONP = function(options, deferred){ if (!('type' in options)) return $.ajax(o ...