[题目链接]

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. Java基本输入输出

    Java基本输入输出 基本输入 基本输出 package com.ahabest.demo; public class Test { public static void main(String[] ...

  2. PrintWriter与ServletOutputStream的区别之文件下载

    copy自:https://blog.csdn.net/weixin_37703598/article/details/803870611.out = response.getWriter(); re ...

  3. A4. JVM 内存分配及回收策略

    [概述] Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的 Ed ...

  4. 大理石在哪儿(Where is the Marble?,Uva 10474)

    现有N个大理石,每个大理石上写了一个非负整数.首先把各数从小到大排序,然后回 答Q个问题.每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上 写着x.排序后的大理石从左到右编号为1 ...

  5. python3爬虫-通过requests获取安居客房屋信息

    import requests from fake_useragent import UserAgent from lxml import etree from http import cookiej ...

  6. LINUX-光盘

    cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 mkisofs /dev/cdrom > ...

  7. 谈谈TCP中的TIME_WAIT

    所以,本文也来凑个热闹,来谈谈TIME_WAIT. 为什么要有TIME_WAIT? TIME_WAIT是TCP主动关闭连接一方的一个状态,TCP断开连接的时序图如下: 当主动断开连接的一方(Initi ...

  8. 腾讯云:iptables基础

    iptables 基础 iptables 基本命令 任务时间:5min ~ 10min iptables 可以简单理解为 Linux 系统内核级防火墙 netfilter 的用户态客户端. Linux ...

  9. Crackme3 破解教程

    Crackme3 破解教程 1.先用PEiD对 Crackme3进行 壳测试 点击File右边的按钮,选中Crackme3 结果如下图所示: 即 无壳. 试运行软件 点击 Register now! ...

  10. swift kilo版代码更新

    今天重新搭建swift服务器,git下代码后一时好奇,进入kilo/stable branch后,与四个月前下载的swift/kilo版本做了个比较.使用diff命令完成.发现代码还是略有区别. di ...