BZOJ5254 FJWC2018红绿灯(线段树)
注意到一旦在某个路口被红灯逼停,剩下要走的时间是固定的。容易想到预处理出在每个路口被逼停后到达终点的最短时间,这样对于每个询问求出其最早在哪个路口停下就可以了。对于预处理,从下一个要停的路口倒推即可。问题只剩下如何求出下一个要停的路口,这相当于求满足di,j%(g+r)>=g的最小j,对d做一个前缀和,那么显然满足条件的是一个值域区间,线段树维护值域区间的路口最小编号即可。对于询问要处理的也与此类似。注意家里没有红灯。(?)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 50010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,g,r,a[N],root,cnt;
ll d[N],s[N];
struct data{int l,r,x;
}tree[N<<];
void ins(int &k,int l,int r,int p,int i)
{
if (!k) k=++cnt,tree[k].x=n+;
tree[k].x=min(tree[k].x,i);
if (l==r) return;
int mid=l+r>>;
if (p<=mid) ins(tree[k].l,l,mid,p,i);
else ins(tree[k].r,mid+,r,p,i);
}
int query(int k,int l,int r,int x,int y)
{
if (!k) return n+;
if (l==x&&r==y) return tree[k].x;
int mid=l+r>>;
if (y<=mid) return query(tree[k].l,l,mid,x,y);
else if (x>mid) return query(tree[k].r,mid+,r,x,y);
else return min(query(tree[k].l,l,mid,x,mid),query(tree[k].r,mid+,r,mid+,y));
}
int getnxt(ll x)
{
x%=g+r;if (x<) x+=g+r;
if (x<=g) return query(root,,g+r-,g-x,g+r--x);
else return min(query(root,,g+r-,,g+r--x),query(root,,g+r-,g+r-(x-g),g+r-));
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5254.in","r",stdin);
freopen("bzoj5254.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),g=read(),r=read();
for (int i=;i<=n;i++) s[i+]=s[i]+(a[i]=read());
for (int i=n;i>=;i--)
{
int nxt=getnxt(-s[i]);
if (nxt==n+) d[i]=s[n+]-s[i];
else d[i]=d[nxt]+((s[nxt]-s[i])/(g+r)+)*(g+r);
if (i) ins(root,,g+r-,s[i]%(g+r),i);
}
m=read();
while (m--)
{
int x=read();
int nxt=getnxt(x);
if (nxt==n+) printf(LL,x+s[n+]);
else printf(LL,d[nxt]+((s[nxt]+x)/(g+r)+)*(g+r));
}
return ;
}
BZOJ5254 FJWC2018红绿灯(线段树)的更多相关文章
- BZOJ 5254 [Fjwc2018]红绿灯 (线段树)
题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求 ...
- [Bzoj5254][Fjwc2018]红绿灯(线段树)
5254: [Fjwc2018]红绿灯 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 31 Solved: 24[Submit][Status][D ...
- BZOJ5254 : [Fjwc2018]红绿灯
显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间. 将所有询问的时间模$g+r$,并按时间用set维护. 那么对于每个红灯,在set中可以找出$1$到$2$ ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
随机推荐
- TCP Over HTTP 的Buffer问题
记录下备忘. 场景:要把TCP拆成一个个HTTP请求,通过Proxy 1.HTTP Client上载数据到CCProxy ,然后再到Web服务器的时候. 如果数据量比较小,例如10个字节,Proxy就 ...
- 树莓派UPS-18650,添加时钟
1.简介 UPS-18650 是一个专门为树莓派(以下简称 pi)所设计的 UPS 电源,采用两颗标准 的 18650 锂电池进行供电,支持外部电源插入检测,支持边充边放,既插上外部电源时, pi 由 ...
- 部署asp.net MVC 4项目到iis
详细步骤如下: 1.安装WIN7的IIS功能 步骤: 控制面板->程序与功能->打开和关闭Windows功能,配置如下图所示[在Internet信息服务路径下勾选所需的就行,全部勾上也行. ...
- AssetBundle加载API
AssetBundle加载API 在Unity 5当中,可以通过4个不同的API来加载AssetBundle,4个API可以用两个条件来区分: AssetBundle是 LZMA压缩. LZ4压缩还是 ...
- Echarts服务端生成图片
Echarts是百度发布的一套优秀的浏览器端图表控件,Echarts是基于html5的cavens绘图实现.而使用server端生成图片无法借用浏览器端渲染.通用的做法有两种: 是用headless浏 ...
- 记一次nginx -t非常慢的排障经历
在一次修改nginx配置时候,执行 case: #/usr/local/nginx/sbin/nginx -t 出现执行命令出现很久没返回结果,也没返回成功或是失败,就是一直卡住的状态,严重影响ngi ...
- mybatis批量插入oracle
<insert id="batchInsert" parameterType="java.util.List"> INSERT INTO TEST( ...
- Java里字符串split方法
Java中的split方法以"."切割字符串时,需要转义 String str[] = s.split("\\.");
- 北航MOOC系统Android客户端NABC
北航MOOC手机客户端NABC分析 1) N (Need 需求) MOOC是Massive Open Online Course的缩写,通常被译为大型开放式网络课程,它最早在08年的时候由一位加拿大的 ...
- iOS开发学习-放大长图与屏幕等宽
/* 需要得到一个图片的放大比例,这个比例就是屏幕的宽度与图片真实宽度的比值 */ CGFloat newZoomScale = LZ_SCREEN_WIDTH / [_photoImageView. ...