P3088 [USACO13NOV]挤奶牛Crowded Cows

题目描述

Farmer John's N cows (1 <= N <= 50,000) are grazing along a one-dimensional fence. Cow i is standing at location x(i) and has height h(i) (1 <= x(i),h(i) <= 1,000,000,000).

A cow feels "crowded" if there is another cow at least twice her height within distance D on her left, and also another cow at least twice her height within distance D on her right (1 <= D <= 1,000,000,000). Since crowded cows produce less milk, Farmer John would like to count the number of such cows. Please help him.

FJ有N(1 <= N <= 50,000)头奶牛沿着一维的栅栏吃草,第i头奶牛在目标点x(i) ,它的身高是 h(i) (1 <=x(i),h(i) <= 1,000,000,000)。

当一头奶牛左边D距离内而且右边D距离内有身高至少是它的两倍的奶牛,t (1 <= D <= 1,000,000,000),它就会觉得拥挤。

请计算觉得拥挤的奶牛的数量。

输入格式

  • Line 1: Two integers, N and D.

  • Lines 2..1+N: Line i+1 contains the integers x(i) and h(i). The locations of all N cows are distinct.

输出格式

  • Line 1: The number of crowded cows.

输入输出样例

输入 #1复制

6 4

10 3

6 2

5 3

9 7

3 6

11 2

输出 #1复制

2

说明/提示

There are 6 cows, with a distance threshold of 4 for feeling crowded. Cow #1 lives at position x=10 and has height h=3, and so on.

The cows at positions x=5 and x=6 are both crowded.

【思路】

单调队列

【题目分析】

每一头牛都有两边的d长度的的区间

只要两边的区间内都有大于等于这头牛两倍身高的牛

那他就会觉得拥挤

求觉得拥挤的牛的数量

【前缀思想】

有身高至少是它的两倍的奶牛?

这完全可以之比较最高的那头奶牛啊?

只要最高的比他的两倍高

那就至少是有的了

如果最高的不如他的两倍高

那一定没有比他两倍高的

所以比较最高的就可

区间最大值?

当然是单调队列

但是两个区间?

那就两个单调队列!

【最终思路】

顺着扫一遍处理出每一个点左边区间内

最高的那头牛

倒着扫一遍处理出每一个点右边区间内

最高的那头牛

(这里区间指的都是合法区间即长度小于等于d的区间)

然后在扫一遍每一个点

看看是不是两倍都有比自己的身高高两倍的牛

如果有那就计数

如果没有那就继续

【完整代码】

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
using namespace std;
const int Max = 50004;
struct node
{
int x;
int h;
}a[Max];
bool cmp(const node x,const node y)
{
return x.x < y.x;
}
deque<node>q1,q2;
int l[Max],r[Max];
int main()
{
// freopen("cow.in","r",stdin);
int n,d;
cin >> n >> d;
for(register int i = 1;i <= n;++ i)
cin >> a[i].x >> a[i].h;
sort(a + 1,a + 1 + n,cmp);
for(register int i = 1;i <= n;++ i)
{
while(!q1.empty() && a[i].x - q1.front().x > d)
q1.pop_front();
if(!q1.empty())
l[i] = q1.front().h;
else
l[i] = 0;
while(!q1.empty() && a[i].h > q1.back().h)
q1.pop_back();
q1.push_back(a[i]);
}
for(register int i = n;i >= 1;i --)
{
while(!q2.empty() && q2.front().x - a[i].x > d)
q2.pop_front();
if(!q2.empty())
r[i] = q2.front().h;
else
r[i] = 0;
while(!q2.empty() && a[i].h > q2.back().h)
q2.pop_back();
q2.push_back(a[i]);
}
int js = 0;
for(register int i = 1;i <= n;++ i)
if(l[i] >= a[i].h * 2 && r[i] >= a[i].h * 2)
js ++;
cout << js << endl;
return 0;
}

洛谷 P3088 [USACO13NOV]挤奶牛Crowded Cows 题解的更多相关文章

  1. 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解

    题面 这道题是一道标准的01分数规划: 但是有一些细节可以优化: 不难想到要二分一个mid然后判定图上是否存在一个环S,该环是否满足∑i=1t(Fun[vi]−mid∗Tim[ei])>0 但是 ...

  2. POJ3621或洛谷2868 [USACO07DEC]观光奶牛Sightseeing Cows

    一道\(0/1\)分数规划+负环 POJ原题链接 洛谷原题链接 显然是\(0/1\)分数规划问题. 二分答案,设二分值为\(mid\). 然后对二分进行判断,我们建立新图,没有点权,设当前有向边为\( ...

  3. 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows

    P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题目描述 Farmer John has decided to reward his cows for their har ...

  4. 洛谷P2868 [USACO07DEC]观光奶牛 Sightseeing Cows

    题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...

  5. 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows

    题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...

  6. 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows(01分数规划)

    题意 题目链接 Sol 复习一下01分数规划 设\(a_i\)为点权,\(b_i\)为边权,我们要最大化\(\sum \frac{a_i}{b_i}\).可以二分一个答案\(k\),我们需要检查\(\ ...

  7. 洛谷 2868 [USACO07DEC]观光奶牛Sightseeing Cows

    题目戳这里 一句话题意 L个点,P条有向边,求图中最大比率环(权值(Fun)与长度(Tim)的比率最大的环). Solution 巨说这是0/1分数规划. 话说 0/1分数规划 是真的难,但貌似有一些 ...

  8. 洛谷P2996 [USACO10NOV]拜访奶牛Visiting Cows

    题目 树形dp 设f[i][j]表示走到第i号节点的最大权值 j为0/1表示这个点选或者不选 如果这个点不选 就从他的子树里的选或者不选选最大 如果这个点选 就加上他子树的不选 f[x][0] += ...

  9. 洛谷 P2996 [USACO10NOV]拜访奶牛Visiting Cows

    P2996 传送门 题意: 给你一棵树,每一条边上最多选一个点,问你选的点数. 我的思想: 一开始我是想用黑白点染色的思想来做,就是每一条边都选择一个点. 可以跑两边一遍在意的时候染成黑,第二遍染成白 ...

随机推荐

  1. System.Web.NullPointerException

    在.Net异步webApi中我们需要记录日志信息,需要获取客户端的ip地址,我们需要使用:HttpContext.Current.Request.ServerVariables["REMOT ...

  2. 2019三六零 java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.360等公司offer,岗位是Java后端开发,最终选择去了三六零. 面试了很多家公司,感觉大部分公司考察的点都差 ...

  3. 自定义指令 VUE基础回顾7

    vue除了有v-if等内置指令,我们也可以创建自定义指令. 例:我们可以实现一个可以每隔一秒闪烁的节点,类似于<blink>标签的行为.添加一个指令类似于添加一个过滤器,可以将他传入vue ...

  4. LCD 驱动 S3C2440A

    LCD Control 1 Register 以16BPP为例 LCD Control 2 Register LCD Control 3 Register LCD Control 4 Register ...

  5. 【等待事件】等待事件系列(5.1)--Enqueue(队列等待)

    [等待事件]等待事件系列(5.1)--Enqueue(队列等待)   1  BLOG文档结构图   2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...

  6. JS 对象 数组求并集,交集和差集

    一.JS数组求并集,交集和差集 需求场景 最近,自己项目中有一些数组操作,涉及到一些数学集的运算,趁着完成后总结一下. 简化问题之后,现有两数组a = [1, 2, 3],b = [2, 4, 5], ...

  7. Oracle 数据类型比较规则

    数值 较大的值被认为大于较小的值.所有负数都小于零,所有正数都小于零.因此,-1小于100:-100小于-1. 浮点值NaN(not a number))大于任何其他数值,且等于自身. 日期时间值 较 ...

  8. go调度: 第二部分-go调度器

    前言 这个博客是三部分中提供go调度器的语义和机制的部分. 博客三部分的顺序: 1) go调度: 第一部分-操作系统调度 2) go调度: 第二部分-go调度器 3) go调度: 第三部分-并发 介绍 ...

  9. Web渗透

  10. nodejs 将不同文件夹中的视频整合到一个文件夹中

    var fs = require("fs") var path = require("path") var listRealPath = path.resolv ...