洛谷 P3088 [USACO13NOV]挤奶牛Crowded Cows 题解
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 题解的更多相关文章
- 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解
题面 这道题是一道标准的01分数规划: 但是有一些细节可以优化: 不难想到要二分一个mid然后判定图上是否存在一个环S,该环是否满足∑i=1t(Fun[vi]−mid∗Tim[ei])>0 但是 ...
- POJ3621或洛谷2868 [USACO07DEC]观光奶牛Sightseeing Cows
一道\(0/1\)分数规划+负环 POJ原题链接 洛谷原题链接 显然是\(0/1\)分数规划问题. 二分答案,设二分值为\(mid\). 然后对二分进行判断,我们建立新图,没有点权,设当前有向边为\( ...
- 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows
P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题目描述 Farmer John has decided to reward his cows for their har ...
- 洛谷P2868 [USACO07DEC]观光奶牛 Sightseeing Cows
题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...
- 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows
题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...
- 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows(01分数规划)
题意 题目链接 Sol 复习一下01分数规划 设\(a_i\)为点权,\(b_i\)为边权,我们要最大化\(\sum \frac{a_i}{b_i}\).可以二分一个答案\(k\),我们需要检查\(\ ...
- 洛谷 2868 [USACO07DEC]观光奶牛Sightseeing Cows
题目戳这里 一句话题意 L个点,P条有向边,求图中最大比率环(权值(Fun)与长度(Tim)的比率最大的环). Solution 巨说这是0/1分数规划. 话说 0/1分数规划 是真的难,但貌似有一些 ...
- 洛谷P2996 [USACO10NOV]拜访奶牛Visiting Cows
题目 树形dp 设f[i][j]表示走到第i号节点的最大权值 j为0/1表示这个点选或者不选 如果这个点不选 就从他的子树里的选或者不选选最大 如果这个点选 就加上他子树的不选 f[x][0] += ...
- 洛谷 P2996 [USACO10NOV]拜访奶牛Visiting Cows
P2996 传送门 题意: 给你一棵树,每一条边上最多选一个点,问你选的点数. 我的思想: 一开始我是想用黑白点染色的思想来做,就是每一条边都选择一个点. 可以跑两边一遍在意的时候染成黑,第二遍染成白 ...
随机推荐
- 函数式接口java.util.function
什么是函数式接口 为什么要用函数式接口 java.util.function和其他的函数式接口 lamdba表达式 方法引用 流 Stream 1 什么是函数式接口 用@FunctionInterfa ...
- 你也可以写个聊天程序 - C# Socket学习1
原文:你也可以写个聊天程序 - C# Socket学习1 简述 我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解.我今天就来和大家一起学习下Socket,并写一个简单 ...
- c# 拼接字符串根据逗号切割 后转换成集合或数组
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_27559331/article/d ...
- java基础 Arrays
package cn.mantishell.day08.demo04; import java.util.Arrays; /** * java.util.Arrays是一个与数组相关的工具类,里面提供 ...
- docker swarm yaml
https://www.cnblogs.com/bigberg/p/8867326.html 一.简介 Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编 ...
- mysql-数据备份与存储过程
目录 修改隔离级别 存储过程 什么是存储过程 用来干什么 三种数据处理方式 备份与恢复 修改隔离级别 修改全局的 set global transaction isolation level read ...
- 英伟达 cuda 开发套件下载
下载地址 https://developer.nvidia.com/cuda-toolkit 安装比较简单,就不多说了.
- 使用vue-cli搭建vue项目问题解决方案
工欲善其事必先利其器,安装所需环境 node和npm的安装 首先需要安装node环境,直接到官网下载安装包 https://nodejs.org/zh-cn/ 安装node默认安装npm, 不需要重复 ...
- node.js数据库操作
node 中使用mysql const http = require('http'); const mysql = require('mysql'); const url = require('url ...
- ifup/ifdown
这两个程序其实是script而已,它会直接到 /etc/ sysconfig/network-scripts目录下搜索对应的配置文件,例如ifup eth0,它会找出ifcfg-eth0这个文件的内容 ...