拥挤的奶牛题解---队列优化DP---DD(XYX)的博客
拥挤的奶牛
时间限制: 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)的博客的更多相关文章
- 圆形谷仓Circular Barn_Silver---(DP优化 / )队列 + 贪心(复杂度O(2n))---DD(XYX)的博客
		
目录 小数据 大数据 小数据 题目描述 农夫约翰有一个圆形的谷仓,谷仓分成了环形的n(3≤n≤1000)个房间,编号为1 , 2 , -- .每个房间有三个门,两个门通往两个相邻的房间,第三个门朝外. ...
 - (四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)的博客
		
滑雪场的高度差 时间限制: 1 Sec 内存限制: 128 MB 题目描述 滑雪场可以看成M x N的网格状山地(1 <= M,N <= 500),每个网格是一个近似的平面,具有水平高度 ...
 - hdu3401:单调队列优化dp
		
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
 - Parade(单调队列优化dp)
		
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
 - [小明打联盟][斜率/单调队列 优化dp][背包]
		
链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...
 - 单调队列以及单调队列优化DP
		
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
 - BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
		
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
 - 单调队列优化dp
		
洛谷p3800(单调队列优化DP) 题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道 ...
 - bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp
		
这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring ...
 
随机推荐
- DirectX11 With Windows SDK--19(Dev) 编译Assimp并加载模型、新的Effects框架
			
前言 注意:这一章进行了重写,对应教程Dev分支第19章的项目,在更新完后面的项目后会替换掉原来第19章的教程 在前面的章节中我们一直使用的是由代码生成的几何模型,但现在我们希望能够导入模型设计师生成 ...
 - Kafka 的稳定性
			
一.事务 1. 事务简介 1.1 事务场景 producer发的多条消息组成⼀个事务这些消息需要对consumer同时可⻅或者同时不可⻅ producer可能会给多个topic,多个partition ...
 - 技术分享 | app自动化测试(Android)--App 控件交互
			
原文链接 常用操作 点击操作 通常获取到元素之后,可以调用 click() 方法来实现对这个元素的点击操作.示例代码如下: python 版本 driver.find_element_by_id(&q ...
 - 【翻译】驯服野兽:Scylla 如何利用控制理论来控制压实
			
教程翻译自Seastar官方文档:https://www.scylladb.com/2018/06/12/scylla-leverages-control-theory/ 转载请注明出处:https: ...
 - 自嗨ReentrantReadWriteLock
			
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...
 - JS:||运算符
			
||逻辑运算符 ||这个符号在开发中 往往是优化的代码最常用的js符号: 当用||连接语句时,回将前后语句变为Boolean类型,再进行运算: 1.当||前面条件为false,不管后面是true/fa ...
 - ServletContext 对象
			
概念:代表整个Web应用 可以和程序的容器通信 (服务器) 获取 通过request对象获取 request.getServletContext(); 通过HTTPServlet获取 this.g ...
 - Aspose最新版文档格式转换使用破解
			
Aspose简介 Aspose.Total是Aspose公司旗下全套文件格式处理解决方案,提供最完整.最高效的文档处理解决方案集,无需任何其他软件安装和依赖.主要提供.net.java.C++d三个开 ...
 - Mac平台下git命令自动补全
			
一.安装bash-completion 安装Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com ...
 - 74HC595驱动(并转串,fpga与时钟匹配,fpga与外部芯片的连接注意事项)
			
上一次设计的动态扫描数码管显示电路模型如上,这是一个32位并行数据[31:0]disp_num选通输出并行数据[7:0]select和[7:0]段选的电路.因此需要输出16个信号 而在开发板上的电路与 ...