\(\color{black}\text{P2390 地标访问 (传送门)}\)

学过区间 DP 的,看到这题的第一反应都是:访问的地标一定是一个区间,并且在不断扩大,区间 DP!可看到数据范围,又瞬间放弃了。与 P1220 关路灯 不同,这题由于没有电量的消耗等额外因素,有这样一个小性质:

  • 贝西的行走路线只可能是三种:一路向左,一路向右或者在中途折返一次。

一路向左和一路向右倒还好理解,可为什么最多只会折返一次呢?考虑以下情况:

如图,贝西从起点出发,折返了多次以访问所有地标。可问题是,以下做法不仅能满足要求,也更优:

换句话说,由于我们访问的地标总是一个区间,而从某个点开始走完整个区间分为三种情况:

  1. 起点在区间左边,一路向右;
  2. 起点在区间右边,一路向左;
  3. 起点在区间里,先前往比较近的端点(左端点或者右端点),再前往另一个端点走完整个区间。

那么,现在问题来了:我们到底能走多少个地标呢?这取决于我们拥有的时间 \(t\)。换句话说,这是在满足条件(所用时间 \(\bm{\le t}\))的情况下找最值。这不就是一个二分答案吗?而且单调性也是显然的:如果不能访问 \(x\) 个地标,那也访问不了 \(y(y>x)\) 个地标;如果能访问 \(x\) 个地标,那也访问的了 \(y(y<x)\) 个地标。

考虑二分答案。难点在于,如何设计 \(\text{check}\) 函数?假设当前二分答案猜测可以访问 \(X\) 个地标,则需要选择连续的 \(X\) 个地标(地标已经按坐标大小排序),即 \(x_1,x_2,\dots,x_X\) 或者 \(x_2,x_3,\dots,x_{X+1}\) 或者 \(x_3,x_4,\dots,x_{X+2}\ \dots\) 我们可以枚举这些区间的终点 \(i\in[X,n]\),则区间的起点为 \(st=i-X+1\)。考虑上面的三种情况:一路向右,一路向左,起点在区间里,只要有一个满足条件就返回 \(\text{True}\)。条件判断的表达式分别为:

x[st] >= 0 && x[i] <= t

x[i] <= 0 && abs(x[st]) <= t

x[st] <= 0 && x[i] >= 0 && min(abs(x[st]), x[i]) + x[i] - x[st] <= t

完全再现了上面的三种情况。

如此一来,代码也就非常好写了:

#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N = 5e4 + 5;

int t, n, a[N];

bool check(int X) {
for (int i = X; i <= n; i++) {
int st = i - X + 1;
if (a[st] >= 0 && a[i] <= t)
return 1;
else if (a[i] <= 0 && abs(a[st]) <= t)
return 1;
else if (a[st] <= 0 && a[i] >= 0 && min(abs(a[st]), a[i]) + a[i] - a[st] <= t)
return 1;
}
return 0;
} signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> t >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + 1 + n);
int l = -1, r = 5e4 + 1;
while (l + 1 < r) {
int mid = l + r >> 1;
if (check(mid))
l = mid;
else
r = mid;
}
cout << l;
return 0;
}

【二分答案】P2390 地标访问的更多相关文章

  1. BZOJ1758 WC2010 重建计划 二分答案、点分治、单调队列

    传送门 看到平均数最大,自然地想到二分答案.那么我们的$check$函数就是要求:是否存在一条长度在$[L,U]$的路径,满足其权值和$\geq 0$. 看到长度在$[L,U]$,自然地想到点分治求解 ...

  2. BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...

  3. hiho一下 第三十八周 二分答案

    题目链接:http://hihocoder.com/contest/hiho38/problem/1 ,挺难想的解题思路,好题. 按照提示的算法来: 我们需要找什么? 在这个题目中我们需要找的是路径最 ...

  4. [Poi2010]Bridges 最大流+二分答案 判定混合图欧拉回路

    https://darkbzoj.cf/problem/2095 bzoj 相同的题挂了,这个oj可以写. 题目就是要我们找一条欧拉回路(每个桥经过一次就好,不管方向),使得这条回路上权值最大的尽量小 ...

  5. CH Round #72树洞[二分答案 DFS&&BFS]

    树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...

  6. [CF752E]Santa Claus and Tangerines(二分答案,dp)

    题目链接:http://codeforces.com/contest/752/problem/E 题意:给n个橘子,每个橘子a(i)片,要分给k个人,问每个人最多分多少片.每个橘子每次对半分,偶数的话 ...

  7. [NOIP2011] 聪明的质检员(二分答案)

    题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...

  8. Codeforces Round #377 (Div. 2) D. Exams(二分答案)

    D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...

  9. {POJ}{3897}{Maze Stretching}{二分答案+BFS}

    题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...

  10. Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案+二分下标)

    貌似是去年阿里巴巴c++的笔试题,没有什么创新直接照搬的... 题意就是找出两个排序数组的中间数,其实就是找出两个排序数组的第k个数. 二分答案,先二分出一个数,再用二分算出这个数在两个排序数组排序第 ...

随机推荐

  1. D365虚拟机安装

    原本有本地VM是2023.3.31安装的,奈何微软不断升级,导致程序一些新特性用不到,例如: 1,Master Planning ---> Planning Optimization, 2,mi ...

  2. 力扣615(MySQL)-平均工资:部门与公司比较(困难)

    题目: 给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同). 表: salary employee_id 字段是表 emplo ...

  3. 力扣162(java&python)-寻找峰值(中等)

    题目: 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可. 你可以假设 nums[ ...

  4. 力扣385(java)-迷你语法分析器(中等)

    题目: 给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger . 列表中的每个元素只可能是整数或整数嵌套列表 示例 1: 输入:s = &q ...

  5. Java工具篇之Disruptor高性能队列

    简介: disruptor适用于多个线程之间的消息队列,`作用与ArrayBlockingQueue有相似之处`,但是disruptor从功能.性能都远好于ArrayBlockingQueue,当多个 ...

  6. 转载 | 基于函数计算自定义运行时快速部署一个 springboot 项目

    简介: 本文转自函数计算征集令优秀征文,活动火热进行中,欢迎大家报名参加! 什么是函数计算? 函数计算是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函 ...

  7. 双龙贺岁,龙蜥 LoongArch GA 版正式发布

    ​简介:Anolis OS 8.4 LoongArch 正式版发布产品包括 ISO.软件仓库.虚拟机镜像.容器镜像. ​ 简介 继  Anolis OS LoongArch 预览版发布后,现迎来龙蜥 ...

  8. Quick Audience 营销活动功能一期上线

    ​简介: 营销活动为Quick Audience(QA)用户洞察下的一个功能模块,通过这个模块,可以将QA侧生成的受众以及营销渠道全部关联起来,从营销活动的视角,一站式完成活动目标制定.活动计划制定到 ...

  9. 【ESSD技术解读-01】 云原生时代,阿里云块存储 ESSD 快照服务如何被企业级数据保护所集成?

    ​简介: 本文描述了阿里云块存储快照服务基于高性能 ESSD 云盘提升快照服务性能,提供轻量.实时的用户体验及揭秘背后的技术原理.依据行业发展及云上数据保护场景,为企业用户及备份厂商提供基于快照高级特 ...

  10. [SVG] JS 动态加载 svg 修改 svg 属性

    svg 概念一览: https://javascript.ruanyifeng.com/htmlapi/svg.html加载 svg: // for example: $('body').load(' ...