[题目链接]

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] 挑剔的美食家的更多相关文章

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

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

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

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

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

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

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

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

  5. 51nod 挑剔的美食家

    挑剔的美食家    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一 ...

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

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

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

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 621  Solved: 280[Submit][Status][Discuss] Description ...

  8. BZOJ 1691 [Usaco2007 Dec]挑剔的美食家 multiset_排序_贪心

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

  9. 【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家

    [算法]扫描线+平衡树(set) [题解]很明显的二维偏序数点,排序后扫描线,现加点后查询答案. 则问题转化为一维偏序,显然贪心找第一个比当前大的最优,所以用平衡树维护. 记得开multiset!!! ...

随机推荐

  1. 打造个人的vimIDE

    环境说明 系统版本:centos7.Ubuntu16 vim版本:7.4 安装git工具 整体说明:本文的vim配置是针对Linux的单个系统用户,python的自动补全使用的是 jedi-vim 插 ...

  2. docker搭建日志收集系统EFK

    EFK Elasticsearch是一个数据搜索引擎和分布式NoSQL数据库的组合,提过日志的存储和搜索功能. Fluentd是一个消息采集,转化,转发工具,目的是提供中心化的日志服务. Kibana ...

  3. TWaver GIS制作穹顶之下的雾霾地图

    “我不满意,我不想等待,我也不再推诿,我要站出来做一点什么.我要做的事,就在此时,就在此刻,就在此地,就在此生”.自离职央视后,沉寂许久的知名记者.主持人柴静昨日携个人视频新作 <穹顶之下> ...

  4. HDU4496 D-City【基础并查集】

    Problem Description Luxer is a really bad guy. He destroys everything he met.  One day Luxer went to ...

  5. request在作用域中管理属性

    request在作用域中管理属性 制作人:全心全意 在作用域中管理属性 setAttribute(String name,Object object) name:表示变量名,为String类型,在转发 ...

  6. Python单例模式的实现方式

    一.单例类 单例模式(Singleton Pattern)是 Python 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类 ...

  7. Python基础函数

    join()函数的用法 join()函数连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 语法:'sep'.join(seq) 参数说明sep:分隔符.可以为空 ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer

    传送门:https://nanti.jisuanke.com/t/31462 本题是一个树上的问题:结点间路径问题. 给定一个有N×M个结点的网格,并给出结点间建立墙(即拆除边)的代价.花费最小的代价 ...

  9. 2.8 补充:shell变量引用方式

    一 变量   变量:本质上是程序中保存用户数据的一块内存空间,变量名就是内存空间地址.   Shell中:变量可由字母数字和下划线组成,以字母或下划线开头.   命名:PATH=/sbin       ...

  10. Vue2.0如何实现父组件与子组件之间的事件发射与接收

    关于vue2.0的事件发射和接收,大家都知道$dispatch和$broadcast在vue2.0已经被弃用了,取而代之的是更加方便快捷的方式,使用事件中心,组件通过它来互相通信,不管组件在哪一个层都 ...