loj

答案显然满足二分性,先二分一个速度\(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」烟花棒的更多相关文章

  1. loj#2391 「JOISC 2017 Day 1」港口设施

    分析 https://yhx-12243.github.io/OI-transit/records/uoj356%3Bloj2391%3Bac2534.html 代码 #include<bits ...

  2. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  3. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

  4. loj #6250. 「CodePlus 2017 11 月赛」找爸爸

    #6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...

  5. [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔

    Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...

  6. [LOJ 6248]「CodePlus 2017 11 月赛」晨跑

    Description “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不 ...

  7. LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP

    题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...

  8. LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路

    题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...

  9. LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)

    LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...

随机推荐

  1. js 原型链、构造函数、原型与实例之间的关系

    面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...

  2. python:科学计数法转化为浮点型数据

    def as_num(x): y='{:.5f}'.format(x) # 5f表示保留5位小数点的float型 return(y) 实验一下 as_num(1.2e-4) In [3]:as_num ...

  3. 自定义有焦点的TextView实现广告信息左右一直滚动的跑马灯效果

    import android.content.Context; import android.text.TextUtils; import android.util.AttributeSet; imp ...

  4. ElementTree 无法处理中文

    ElementTree.fromstring()  导入xml格式时,是可以选择解析parser的编码的,并且 它解析出来的node类型是 严谨且严格的,不会 自己内部全部转换成str,比如 9.87 ...

  5. OpenStack 节点重启后无法联网的问题

    问题 五一归来,大量服务器被重启了,其中一台服务器失联了.通过远程桌面登录之后发现服务器的 IP 地址是 "正常" 的,可以 Ping 通自己的 IP,但 Ping 不同网关. 解 ...

  6. OpenStack 虚拟机启动流程 UML 分析(内含 UML 源码)

    目录 文章目录 目录 前言 API 请求 Nova API 阶段 Nova Conductor 阶段 Nova Scheduler 阶段 Nova Compute 阶段(计算节点资源分配部分) Nov ...

  7. spring boot configuration annotation processor not found in classpath

    <dependency> <groupId> org.springframework.boot </groupId> <artifactId> spri ...

  8. python导入csv文件出现SyntaxError问题分析

    python导入csv文件出现SyntaxError问题分析 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表list对象,在Python中,这样的赋值语句,其实内部 ...

  9. 走进异步编程的世界 - 在 GUI 中执行异步操作

    转载:https://www.cnblogs.com/liqingwen/p/5877042.html 走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://w ...

  10. Day03:日期操作 / 集合框架(上)

    日期操作 Java中的时间 · Java中的时间使用标准类库的Date类表示,是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点: · 固定的时间点叫纪元(epoch),是U ...