Glider(前缀和+二分)
题目链接:Glider Gym-101911B
解题分析:下落的高度一定,是h。在没有气流的地方每秒下落1;所以可以转化为经过无气流地带的时间总长为h。
那么很显然从一个有气流地带的开始,选择下落,那么问题来了,一个一个去试然后一个一个计算他的路径去维护一个最大值吗?未免太过麻烦,所给数据有
那么大。
解题关键:二分+前缀和
二分查找用:lower_bound()
int x=lower_bound(a, a+n, val)-a;
其中i返回值为数组元素值大于等于val的第一个下标。相应地,如果数组中的所有元素的值都小于val,则返回值为数组最后一个元素下标的下一个下标
具体见代码注释:
/* 所给的数据:气流范围是按顺序给的,方便直接求前缀和*/ # include <iostream> # include <stdio.h> # include <string.h> # include <string> # include <iomanip> # include <algorithm> # include <ctime> # include <cmath> # include <climits> # include <cstdlib> # include <utility> # include <bitset> # include <cctype> # include <cassert> # include <set> # include <map> # include <deque> # include <queue> # include <stack> # include <vector> # include <functional> using namespace std;typedef long long ll; const int maxn=2e5+50; const ll mod=1e9+7; const int eps=1e-8; const double pi=acos(-1.0); # define mem(a,x) memset((a),(x),sizeof((a))) # define gcd(a,b) (__gcd(a, b)) # define lcm(a,b) (a*b/__gcd(a, b)) # define lson l,m,rt<<1 # define rson m+1,r,rt<<1|1 # define lowbit(x)(x&(-x))struct nod {int l, r; }x[maxn];int a[maxn], b[maxn];//a[i]表示前i个气流带的总长度,b[i]表示前i个无气流带(人的下降区)的总长度。 int main() {int n, h;cin>>n>>h;for(int i=1; i<=n; i++ )cin>>x[i].l>>x[i].r;int maxx=-1;a[1]=x[1].r-x[1].l;b[1]=0;for(int i=2; i<=n; i++ ){a[i] = a[i-1] + x[i].r - x[i].l;b[i] = b[i-1] + x[i].l - x[i-1].r;}b[n+1]=0x3f3f3f3f;for(int i=1; i<=n; i++ ){int pos=lower_bound(b+1, b+1+n, b[i]+h)-b;//利用二分查找第一个大于等于b[i]+h的点的位置posmaxx = max(maxx, a[pos-1]-a[i-1]);//a[pos-1]-a[i-1]为经过的当我们下降h时经过的上升气流的长度 }cout<<maxx+h<<endl;return 0; }
转载于:https://www.cnblogs.com/wsy107316/p/11392492.html
Glider(前缀和+二分)相关推荐
- Gym - 101911B Glider(前缀和+二分)
传送门:点我 A plane is flying at a constant height of hh meters above the ground surface. Let's consider ...
- poj3061尺取法/前缀和 二分(java)
今天遇到这题因为以前没见到过,当时就是想着应该有着一个很简单的方法可以过但是奈何就是没思路.后来看了别人思路写了下来.学习了尺取法 poj3061 题目介绍: Description A sequen ...
- [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
[问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...
- LeetCode 528. 按权重随机选择(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...
- LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个非重叠轴对齐矩形的列表 rects,写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点. 提示: 整数点是具有整数坐标的点. 矩形周边上 ...
- 209 长度最小的子数组(前缀和+二分查找、滑动窗口)
1. 问题描述: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的子数组,返回 0. 示例: 输入:s = ...
- HDU 6406 Taotao Picks Apples(前缀和+二分)
HDU 6406 Taotao Picks Apples(前缀和+二分) Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- Music Notes(前缀和+二分)
链接:https://ac.nowcoder.com/acm/contest/1077/I 来源:牛客网 Music Notes 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- LeetCode 1712. 将数组分成三个子数组的方案数(前缀和 + 二分查找)
文章目录 1. 题目 2. 解题 221 / 3117,前7.1% 574 / 9692,前 5.9% 周赛前2题如下: LeetCode 5641. 卡车上的最大单元数(排序,模拟) LeetCod ...
最新文章
- kafka权威指南_Kafka-分区、片段、偏移量
- bug修复录-qq浏览器中post请求时body为空
- Redis的常用命令——set的常用命令
- 前端在linux中常用的命令,前端应该会的23个linux常用命令
- gitbash如何修改可恶的蓝色字体
- jvm 宕机 打印jvm_通过入侵JVM打印阵列
- web开发常用js功能性小技巧(转)
- 基于Sanic的微服务基础架构
- 基于单片机GSM的防火防盗系统的设计
- 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?
- Vsphere平台虚拟机vmdk文件丢失重建
- Ubuntu衍生发行版使用体验(lubuntu、xubuntu、kubuntu)
- Xilinx FPGA资源
- win10 ST-GCN复现
- Tomcat 配置与部署
- Python:一键更换桌面壁纸
- 微信小程序实现人脸识别注册登录
- maven之插件仓库
- 如何成为技术领袖【转】
- 升级CocoaPods 1.0.0问题解决汇总