拥挤的奶牛题解---队列优化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 ...
随机推荐
- Dcoker镜像管理与容器应用
Dcoker镜像管理与容器应用 docker基于镜像创建容器 相同版本的镜像只允许存在一个 同一个镜像可以创建多个容器 镜像管理 [root@localhost ~]# docker pull cen ...
- JVM 输出 GC 日志导致 JVM 卡住,我 TM 人傻了
本系列是 我TM人傻了 系列第七期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了:https://zhuanlan.zhihu.com/p/3970425 ...
- C# 读写文件从用户态切到内核态,到底是个什么流程?
一:背景 1. 一个很好奇的问题 我们在学习 C# 的过程中,总会听到一个词叫做 内核态 ,比如说用 C# 读写文件,会涉及到代码从 用户态 到 内核态 的切换,用 HttpClient 获取远端的数 ...
- RPA供应链管制单修改机器人
背景:供应链环节中,研发物料时而因为市场缺货等原因无法采购,资材部需登入系统修改物料管制单. 操作流程:登录PDM系统中读取数据.登录ERP系统中更新数据. 人工操作:每日耗时3.5小时,出现一定比例 ...
- 密码学系列之:在线证书状态协议OCSP详解
目录 简介 PKI中的CRL CRL的缺点 CRL的状态 OCSP的工作流程 OCSP的优点 OCSP协议的细节 OCSP请求 OCSP响应 OCSP stapling 总结 简介 我们在进行网页访问 ...
- lerna源码阅读
能够找到入口文件 能够本地调试
- SpringBoot接口 - 如何优雅的写Controller并统一异常处理?
SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai 为什么要优雅的处理异常 如果我们不统一的处理异常,经 ...
- 常用源&配置
ubuntu16.04 阿里 cp /etc/apt/sources.list /etc/apt/sources.list.orgin && \ echo "\ deb ht ...
- C++算数运算符和位运算符
C++根据功能和用途将运算符分为算数运算符.位运算符.关系运算符和逻辑运算符等不同类型.四种不同运算符的优先级从大到小依次位算-位-关-逻. 一.算数运算符 1.加减乘除(+ - * /) 加减乘除位 ...
- 5-12 RabbitMQ 消息队列
RabbitMQ 什么是RabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现. AMQP :Advanced Message Queue,高级消息队列协议.它是 ...