5254: [Fjwc2018]红绿灯


Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 31  Solved: 24
[Submit][Status][Discuss]

Description


泰迪每天都要通过一条路从家到学校,这条路的起点是泰迪家,终点则是学校。
这条路中间还有n个路口,从第i-1个路口走到第i个路口需要di秒,每个路口都有一个红绿灯。更具体的,绿灯持
续时间是g秒,红灯持续时间是r秒。每天从第0秒开始,所有灯都是绿灯,持续g秒之后变为红灯,再过r秒变成绿
灯,以此类推,并且同一时刻所有灯都是相同状态。当泰迪到达一个路口,若是绿灯则可直接通过,若是红灯则需
原地等待至绿灯。若到达某一路口时灯的状态正好发生改变,则视达到路口时灯的颜色为其改变后的颜色,例如第
g秒到达一个路口则视为遇到红灯。
现在泰迪预计了接下来q天从家出发的时间,第j天将会在第tj秒从家出发,他希望你告诉他每天到达学校的最早时
间。你可以假定一天内泰迪一定可以到达学校。

Input


第一行三个正整数n,g,r表示路口数以及绿灯、红灯持续的时间。
第二行n+1个正整数di表示相邻路口间的通行时间
d1表示从起点到第一个路口所需的时间,dn+1表示第n个路口到终点的所需时间。
第三行一个正整数q表示询问天数。
第四行q个非负整数tj表示每天的出发时间
n, q ≤ 5 × 10^4 , 2 ≤ g, r ≤ 10^9 , di, tj ≤ 10^9

Output


共q行,对于每次询问输出一行一个整数表示答案。

Sample Input



Sample Output



HINT


 

Source


By ExfJoe

分析:


先不考虑红绿灯,处理出到每个路口前缀和,离散化后建权值线段树,倒着来扫一遍,找到每个点出发第一个红灯在哪。
预处理出以每个点从时刻0出发,考虑红绿灯时到学校的路径(即f数组)
然后每次询问只用找到第一个红灯出现的地方,和预处理相同。

AC代码:


# include <iostream>
# include <cstdio>
# include <algorithm>
using namespace std;
typedef long long LL;
const int N = 5e4 + ;
int block[N],tot,n,m,Q;LL G,C,P,d[N],b[N],s[N],f[N],w;
int mi[N << ];
void push(int x){mi[x] = min(mi[x << ],mi[x << | ]);}
void updata(int L,int l,int r,int rt,int v)
{
if(l == r){mi[rt] = v;return;}
int mid = l + r >> ;
if(L <= mid)updata(L,l,mid,rt << ,v);
else updata(L,mid + ,r,rt << | ,v);
push(rt);
}
int Query(int L,int R,int l,int r,int rt)
{
if(L > R)return n + ;
if(L <= l && r <= R)return mi[rt];
int mid = l + r >> ;
if(L > mid)return Query(L,R,mid + ,r,rt << | );
if(R <= mid)return Query(L,R,l,mid,rt << );
return min(Query(L,R,l,mid,rt << ),Query(L,R,mid + ,r,rt << | ));
}
int query(LL w)
{
w = (w % P + P) % P;
LL L,R;int lc,rc,k;
L = (G + w) % P,R = (P - + w) % P;
lc = lower_bound(b + ,b + m + ,L) - b;
rc = upper_bound(b + ,b + m + ,R) - b - ;
if(L <= R)k = Query(lc,rc,,m,);
else k = min(Query(lc,m,,m,),Query(,rc,,m,));
return k;
}
void add(int x,int y,LL bac)
{
f[x] = f[y] + s[y] - s[x];
if(y != n + )f[x] = f[x] + P - (s[y] - s[x] + bac) % P;
}
int main()
{
scanf("%d %lld %lld",&n,&G,&C);P = G + C;
for(int i = ;i <= n + ;i++)scanf("%lld",&d[i]);
for(int i = ;i <= n + ;i++)s[i] = s[i - ] + d[i],b[i] = s[i] % P;
b[n + ] = ;b[n + ] = P;
sort(b + ,b + n + );
m = unique(b + ,b + n + ) - b - ;
for(int i = ;i <= (m << );i++)mi[i] = n + ;
int k;
for(int i = n;i >= ;i--)
{
k = query(s[i] % P);
add(i,k,);
updata(lower_bound(b + ,b + m + ,s[i] % P) - b,,m,,i);
}
scanf("%d",&Q);
while(Q--)
{
scanf("%lld",&w);
k = query(-w);
add(,k,w);
printf("%lld\n",f[] + w);
}
}

[Bzoj5254][Fjwc2018]红绿灯(线段树)的更多相关文章

  1. BZOJ 5254 [Fjwc2018]红绿灯 (线段树)

    题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求 ...

  2. BZOJ5254 FJWC2018红绿灯(线段树)

    注意到一旦在某个路口被红灯逼停,剩下要走的时间是固定的.容易想到预处理出在每个路口被逼停后到达终点的最短时间,这样对于每个询问求出其最早在哪个路口停下就可以了.对于预处理,从下一个要停的路口倒推即可. ...

  3. BZOJ5254 : [Fjwc2018]红绿灯

    显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间. 将所有询问的时间模$g+r$,并按时间用set维护. 那么对于每个红灯,在set中可以找出$1$到$2$ ...

  4. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  7. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

随机推荐

  1. How To:Linux下如何通过命令检查网卡是否插上网线

    主要工具为ethtool来检查,主要关注的字段为"Link detected",注意如下的输出,其中em4实际物理上并未插上网线,而em1是插上网线的: # ethtool em4 ...

  2. vue-router介绍及简单使用

    一.vue-router介绍 vue-router是vue官方提供的一个路由框架,控制页面路由,使用较为方便. 1.路由模式 hash(浏览器环境默认值),使用 URL hash 值来作路由,支持所有 ...

  3. (转)UIPanGestureRecognizer

    UIPanGestureRecognizer是UIGestureRecognizer类的一个扩展类,其扩展类有UITapGestureRecognizer,UIPinchGestureRecogniz ...

  4. Ubuntu 15.04 Qt5 链接 mysql数据库

    序 最近在Ubuntu15.04下做一个Linux-服务器-客户端通信项目,用到MySQL数据库.开始的时候,在数据库链接时遇到障碍,查找资料解决. 特此记录,分享于此. 环境配置 系统:Ubuntu ...

  5. PAT Basic 1040

    1040 有几个PAT 字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串 ...

  6. Linux下安装Oracle客户端

    1.创建用户名和组名 /usr/sbin/groupadd oinstall /usr/sbin/groupadd dba /usr/sbin/useradd -m -g oinstall -G db ...

  7. IOS UITest 初始化 ViewController

    import XCTest @testable import UITestDemo class UITestDemoTests: XCTestCase { var homevc:HomeViewCon ...

  8. Oracle 数据库有五个必需的后台进程,DBWR,LGWR,CKPT,SMON,PMON

    SMON 是系统监视器(System Monitor)的缩写.如果Oracle实例失败,则在SGA中的任何没有写到磁盘中的数据都会丢失.有许多情况可能引起Oracle实例失败,例如,操作系统的崩溃就会 ...

  9. hdu6069[素数筛法] 2017多校4

    对于[l , r]内的每个数,根据唯一分解定理有   所以有  因为     //可根据唯一分解定理推导 所以      题目要求 就可以运用它到上述公式 (注意不能暴力对l,r内的数一个个分解算贡献 ...

  10. BZOJ 4004 [JLOI2015]装备购买 ——线性基

    [题目分析] 题目很简单,就是要维护一个实数域上的线性基. 仿照异或空间的线性基的方法,排序之后每次加入一个数即可. 卡精度,开long double 和 1e-6就轻松水过了. [代码] #incl ...