loj 2392「JOISC 2017 Day 1」烟花棒
答案显然满足二分性,先二分一个速度\(v\)
然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有火的人应该是选前面一个或后面一个没火的人,去和他相遇,所有任意时刻点过火的人都是连续的区间\([L,R](L\le k \le R)\)
现在要做的是推出\([1,n]\)是否可以被全部点火.一个区间\([L,R]\)能被点火,至少要满足的条件为\(x_R-x_L\le 2tv(R-L)\),即这两个人至少要在\(t(R-L)\)时间内相遇.对于一个合法的点火方案,过程中每个区间都满足这个条件,然后考虑证明前驱区间都满足条件的区间一定合法.首先第一个区间\([k,k]\)一定合法;然后在上一个区间合法的情况下,因为两个区间都满足条件,即\(x_R-x_L\le 2tv(R-L)\),那么最右边那个点都能碰到左边那个点,并且如果只有\([L,R]\)之间的点,所有点走不会走出\([x_L,x_R]\),那么其他的点更能碰到新加进来的点了
所以问题变成要把\([k,k]\)拓展成\([1,n]\),每次可以给左右端点移动一格,要使得始终满足\(x_R-x_L\le 2tv(R-L)\),问有没有合法方案.首先把这个柿子化一下,得到\(x_L-2tvL\ge x_R-2tvR\),然后记\(b_i=x_i-2tvi\),那么就是要始终使得\(a_L\ge a_R\).然后每次一直移动左/右端点直到无法移动,为了更优的移动,每次移动左端点时移动到\(L'\),并满足\(b_{L'}\ge b_L\)以及\(\min_{i=L'}^{L} b_i \ge b_R\),这样子移动显然可以给右端点创造出更好的移动条件.右端点的移动也是类似的
如果最后\(L,R\)有一个没移动到最值点,并且不能再移动了,那么就无解.否则,移动到最值点,如果左边右边还有一段路程,那么这时直接移动显然可能会导致无解.现在考虑把左右端点设为\(1\)和\(n\),然后分别移动到\(L\)和\(R\),这个过程可以套用前面的做法.因为这个移动过程可逆,并且倒着移动过程也是和正着移动过程有相同性质,所以是合法的
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db long double
using namespace std;
const int N=1e5+10;
const db eps=1e-4;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
};
int n,kk,t,ft[N],nt[N];
db a[N],b[N],bb[N],mid,mi[N],mx[N];
int s1[N],t1,s2[N],t2;
bool ck(int n,db kk,bool oo)
{
t1=t2=0;
for(int i=1;i<=kk;++i)
{
db nw=b[i];
while(t1&&b[s1[t1]]<b[i]) nw=min(nw,mi[t1]),--t1;
s1[++t1]=i,mi[t1]=nw;
}
for(int i=n;i>=kk;--i)
{
db nw=b[i];
while(t2&&b[s2[t2]]>b[i]) nw=max(nw,mx[t2]),--t2;
s2[++t2]=i,mx[t2]=nw;
}
int ll=kk,rr=kk+oo;
while(t1>1||t2>1)
{
bool fg=0;
while(t1>1&&mi[t1]>=b[rr]) fg=1,--t1,ll=s1[t1];
while(t2>1&&b[ll]>=mx[t2]) fg=1,--t2,rr=s2[t2];
if(!fg) break;
}
if(t1>1||t2>1) return 0;
if(ll==1&&rr==n) return 1;
if(oo) return 0;
int tp=0;
for(int i=ll;i;--i) bb[++tp]=b[i];
for(int i=n;i>=rr;--i) bb[++tp]=b[i];
memcpy(b,bb,sizeof(db)*(tp+1));
return ck(tp,ll,1);
}
int main()
{
n=rd(),kk=rd(),t=rd();
for(int i=1;i<=n;++i) a[i]=rd();
db l=0,r=1e9,ans=1e9;
while(r-l>eps)
{
mid=(l+r)/2;
for(int i=1;i<=n;++i) b[i]=a[i]-2*mid*t*i;
if(ck(n,kk,0)) ans=mid,r=mid-eps;
else l=mid+eps;
}
printf("%d\n",(int)ceil(ans-eps*2));
return 0;
}
loj 2392「JOISC 2017 Day 1」烟花棒的更多相关文章
- loj#2391 「JOISC 2017 Day 1」港口设施
分析 https://yhx-12243.github.io/OI-transit/records/uoj356%3Bloj2391%3Bac2534.html 代码 #include<bits ...
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- loj #6250. 「CodePlus 2017 11 月赛」找爸爸
#6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...
- [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔
Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...
- [LOJ 6248]「CodePlus 2017 11 月赛」晨跑
Description “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不 ...
- LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...
- LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路
题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...
- LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)
LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...
随机推荐
- java 百度地图判断两点距离1
package baiduApi; /** * 类名称:PointToDistance * 类描述:两个百度经纬度坐标点,计算两点距离 * 创建人:钟志铖 * 创建时间:2014-9-7 上午10:1 ...
- centos7编译安装Python 3.6.8 后用pip3出现SSL未配置问题(import ssl失败)解决方法
下载源码编译安装openssl https://www.openssl.org/source/openssl-1.0.2j.tar.gz ./config --prefix=/usr/local/op ...
- js闭包1
闭包是函数和声明该函数的词法环境的组合. function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 fun ...
- Mysql密码忘记,修改密码方法
1.set password for ‘root’@’localhost’ = password(‘czllss’); -- czllss为新密码
- alt + tab 替代品 switcheroo
作为windows10 alt+tab的增强品: 分享下: 原版: https://github.com/elig0n/Switcheroo 单击版本 https://github.com/elig0 ...
- Idea Debug多线程不进断点问题处理
Idea也会使我狼狈不堪,Eclipse下约定成俗,却非Idea的默认规则. 比如 DEBUG多个线程时,Idea的默认设定就会遇到断点不能进入的问题. 解决的方法: 点击DEBUF框下的双红点(Vi ...
- PHP $_SERVER超全局变量
$_SERVER是php中的超全局变量,一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web 服务器创建. ...
- ‘No module named 'numpy.core._multiarray_umath’ 或者‘no module named numpy’
在import TensorFlow时,如果遇到‘No module named 'numpy.core._multiarray_umath’ 或者‘no module named numpy’,大多 ...
- Python-数据库索引浅谈
检索原理 检索初识 索引在MySQL中是一种"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的检索性能,非常关键,尤其是当表中的数据量越大,索引对于性能的提升越显 ...
- typeScript入门配置
typeScript是有微软开发的一款开源的编程语言. TypeScript是JavaScript的一个超集,从今天数以百万计的JavaScript开发者所熟悉的语法和语义开始.可以使用现有的Java ...