拥挤的奶牛

时间限制: 1 Sec  内存限制: 128 MB

题目描述

FJ的n头奶牛(1<=n<=50000)在被放养在一维的牧场。第i头奶牛站在位置x(i),并且x(i)处有一个高度值h(i)

(1<=x(i),h(i)<=1000000000)。

一头奶牛感觉到拥挤当且仅当它的左右两端都有一头奶牛所在的高度至少是它的2倍,且和它的距离最多为D。尽管感到拥挤的奶牛会产生更少的牛奶,FJ还是想知道一共有多上感到拥挤的奶牛。请你帮助他。

输入

第一行:两个整数n和D。

第二行到第n+1行:每一行有两个数表示x(i)和h(i)。

输出

一个数k表示感到拥挤的奶牛的数量。

方法

这道题确实烧脑,因为它没办法用单调队列去存。 假设 i 大于队末元素 j ,则在普通的下降单调队列中, j 就因该被计算并且出队,但是若 i 并不大于等于 2 * j ,就不能计算 j 。若此时把 i 直接入队,就缺乏单调性,不方便计算了。

既然此题数据过大,需要优化,却又不能用单调队列/栈的话,能不能只利用它 O(2n) 的优点,采用更灵活的结构呢?

我的想法是,先按照位置排序,然后用一个优先队列,令 (node)a < b 为 a.h < b.h,用小根堆优化。跟单调队列差不多。每次有元素 x 入堆,就先把堆顶(最矮的那些)身高不超过  的奶牛计算了,如果有与 x 的距离超过 D 的,就直接出堆,然后再把 x 入堆。计算两遍,一次计算右边有无拥挤,一次计算左边。

这样一来,每个元素仍然只有 入堆,出堆 两种计算,时间复杂度也还是 n 的常数倍!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
void read(int &x) {
int f = 1;x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
x *= f;
}
struct no{
int id,x,h;
}a[50005];
bool operator < (no a,no b) {
return a.h < b.h;
}
bool operator > (no a,no b) {
return b < a;
}
int n,m,s,o,i,j,k;
bool l[50005],r[50005];
priority_queue<no,vector<no>,greater<no> > b;
bool cmp(no a,no b) {
return a.x < b.x;
}
int main() {
read(n);read(m);
for(i = 1;i <= n;i ++) {
read(a[i].x);read(a[i].h);
a[i].id = i;
}
sort(a + 1,a + 1 + n,cmp);
b.push(a[1]);
for(i = 2;i <= n;i ++) {
while(!b.empty() && a[i].h >= b.top().h * 2) {
if(a[i].x - b.top().x <= m) {
r[b.top().id] = 1;
}
b.pop();
}
b.push(a[i]);
}
while(!b.empty()) b.pop();
b.push(a[n]);
for(i = n - 1;i > 0;i --) {
while(!b.empty() && a[i].h >= b.top().h * 2) {
if(b.top().x - a[i].x <= m) {
l[b.top().id] = 1;
}
b.pop();
}
b.push(a[i]);
}
for(i = 1;i <= n;i ++) {
if(l[i] && r[i]) k ++;
}
printf("%d",k);
return 0;
}

拥挤的奶牛题解---队列优化DP---DD(XYX)​​​​​​​的博客的更多相关文章

  1. 圆形谷仓Circular Barn_Silver---(DP优化 / )队列 + 贪心(复杂度O(2n))---DD(XYX)​​​​​​​的博客

    目录 小数据 大数据 小数据 题目描述 农夫约翰有一个圆形的谷仓,谷仓分成了环形的n(3≤n≤1000)个房间,编号为1 , 2 , -- .每个房间有三个门,两个门通往两个相邻的房间,第三个门朝外. ...

  2. (四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)​​​​​​​的博客

    滑雪场的高度差 时间限制: 1 Sec  内存限制: 128 MB 题目描述 滑雪场可以看成M x N的网格状山地(1 <= M,N <= 500),每个网格是一个近似的平面,具有水平高度 ...

  3. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  4. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  5. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  6. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  7. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  8. 单调队列优化dp

    洛谷p3800(单调队列优化DP) 题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道 ...

  9. bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp

    这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring ...

随机推荐

  1. 【二分图】匈牙利 & KM

    [二分图]匈牙利 & KM 二分图 概念: 一个图 \(G=(V,E)\) 是无向图,如果顶点 \(V\) 可以分成两个互不相交地子集 \(X,Y\) 且任意一条边的两个顶点一个在 \(X\) ...

  2. 【生成对抗网络学习 其一】经典GAN与其存在的问题和相关改进

    参考资料: 1.https://github.com/dragen1860/TensorFlow-2.x-Tutorials 2.<Generative Adversarial Net> ...

  3. CentOS8设置国内镜像源(阿里云镜像)

    CentOS8设置国内镜像源(阿里云) 1.备份原有配置 [root@localhost ~]# mkdir /etc/yum.repos.d.bak [root@localhost ~]# mv / ...

  4. 使用 DartPad 制作代码实践教程

    DartPad 是一个开源的.在浏览器中体验和运行 Dart 编程语言的线上编辑器,目标是为了帮助开发者更好地了解 Dart 编程语言以及 Flutter 应用开发. DartPad 项目起始于 20 ...

  5. python PIL 图片素描化

    from PIL import Image import numpy as np a = np.asarray(Image.open("D://7.jpg").convert('L ...

  6. 一张图进阶 RocketMQ - NameServer

    前言 「三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦.」 一张图进阶 RocketMQ 图 ...

  7. 【Redis】哨兵初始化和主观下线

    在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数 ...

  8. python基础知识-day8(函数实战)

    1 def out(): 2 username=input("请输入用户名:\n") 3 password=input("请输入密码:\n") 4 return ...

  9. centos通过日志查入侵

    1. Linux查看/var/log/wtmp文件查看可疑IP登陆 last -f /var/log/wtmp 该日志文件永久记录每个用户登录.注销及系统的启动.停机的事件.因此随着系统正常运行时间的 ...

  10. 用WindowsAppSDK(WASDK)优雅的开发上位机应用

    C#开发上位机应用的一些选择 如果你不想看介绍,可以直接跳到优雅开发示例那里. 1. WASDK(WinUI 3) Windows 应用 SDK 是一组新的开发人员组件和工具,它们代表着 Window ...