博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【hrbust2294】修建传送门
阅读量:6802 次
发布时间:2019-06-26

本文共 624 字,大约阅读时间需要 2 分钟。

题意

n个点1~n,i到i+1的距离为a[i],现在可以在两个点之间建一个传送门,则两点之间距离为0,求建传送门后1号出发的最远距离最小是多少?

题解

a[i]的前缀和为s[i]。

假设在A、B两点建立传送门后,两点距离为dis[i][j]。

对于B固定的情况,最远距离要么是s[n-1]-s[B],要么是dis[1][k]里的最大值,k为A、B两点之间的点, dis[1][k]=min(s[k],s[A]+(s[B]-s[k]))。s[A]显然越小越好。所以就让A在第一个点的位置。于是dis[1][k]=min(s[k],s[B]-s[k])。

假设最大的dis[1][k]的 k 为 C。

满足\[s[j]<s[B]-s[j]且s[j+1]\ge s[B]-s[j+1]\]的 j 或者 j+1 就是 C(其实就是AB中间位置两边的点)。
这里的C是随着B递增不会减小的,因此不用O(\(n^2\)),只要每次维护 j 满足不等式即可。

代码

#include
#include
using namespace std;int n;long long s[100005];//注意要开long longint main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i

转载地址:http://gjjwl.baihongyu.com/

你可能感兴趣的文章
为了忘却的纪念,我的天龙游戏生涯
查看>>
12294错误事件的处理--利用审核日志查找病毒来源
查看>>
第25讲: Scala中柯里化实战详解
查看>>
81.LAMP,PHP5和PHP7安装
查看>>
linux服务(一)LAMP编译安装
查看>>
一次RPC调用时间都去哪儿了
查看>>
linux的rsync工具的常用选项及ssh同步介绍
查看>>
oracle内存体系(二)
查看>>
ReflectASM的使用
查看>>
智能家居监控移动手机组态现实生活中的应用
查看>>
笔试题、面试题
查看>>
shell 数组
查看>>
Linux操作系统的安装
查看>>
服务器RAID
查看>>
python函数是引用传递(对可变对象而言)
查看>>
Cisco ASA防火墙简易配置与调试手册
查看>>
Node.js搭建聊天室
查看>>
Rob Pike的5个编程原则
查看>>
Expression Blend实例中文教程(7) - 动画基础快速入门Animation
查看>>
《第一行代码》1day~了解全貌
查看>>