题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求他在$k$时刻出发到达学校的时间$(Q<=5*10^4)$

终于过了..jdr是真的duliu

搞了半个多下午才看懂题解

首先总路程一定大于等于$\sum d_{i}$,所以求出等红灯的总时间就行了

红绿灯的周期是$(g+r)$,所以 超过$g+r$的道路 或者 询问的时刻$k$ ,直接取模$(g+r)$即可

定义$f[i]$表示第一次在第i个位置停下(被红灯卡住),然后等变绿以后,再走到终点的路程中,等红灯的总时间

如果我们求出了$f[i]$,那么对于每个询问,只需要找出在时刻$k$出发,第一个停下的位置就行了

如果在第$i$个位置停下,设下一个停下的位置是$j$,显然$j$是唯一的

维护一个权值线段树,值域是$[0,g+r)$,表示在x时刻出发,第一次停下的位置是$a_{x}$,由于是找出第一次停下的位置,所以倒序枚举红绿灯

如果$x$时刻出发能够在位置i停下,可得$g<=(x+dis[i])<=g+r-1$,即到达i之后恰好是红灯

然后把在线段树内把$x$的可行区间全都修改成$i$

而$f[i]$可以通过在线段树里找$-dis[i]$,得到$i$下一个停下的位置$j$

统计答案算一下总路程加上等红灯的额外时间就行了

权值可能很大需要动态开点

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define NN 101000
#define ll long long
using namespace std; int n,m,g,r,root;
int d[NN];
ll dis[NN],f[NN];
struct Seg{
int tag[NN*],val[NN*],ls[NN*],rs[NN*],tot;
void pushdown(int rt){
if(!tag[rt]) return;
if(!ls[rt]) ls[rt]=++tot;
if(!rs[rt]) rs[rt]=++tot;
val[ls[rt]]=val[rs[rt]]=tag[rt];
tag[ls[rt]]=tag[rs[rt]]=tag[rt];
tag[rt]=;
}
void update(int L,int R,int l,int r,int &rt,int w)
{
if(!rt) rt=++tot;
if(L<=l&&r<=R){tag[rt]=w,val[rt]=w;return;}
int mid=(l+r)>>;pushdown(rt);
if(L<=mid) update(L,R,l,mid,ls[rt],w);
if(R>mid) update(L,R,mid+,r,rs[rt],w);
//pushup(rt);
}
int query(int x,int l,int r,int rt)
{
if(!rt) return ;
if(l==r) return val[rt];
int mid=(l+r)>>;pushdown(rt);
if(x<=mid) return query(x,l,mid,ls[rt]);
else return query(x,mid+,r,rs[rt]);
//pushup(rt);
}
}s; int main()
{
scanf("%d%d%d",&n,&g,&r);
const int ma=g+r;
ll tot=;
for(int i=;i<=n+;i++){
scanf("%d",&d[i]);
tot+=d[i];d[i]%=ma;
dis[i]=dis[i-]+d[i];
}
ll L,R,w;int x,y;
root=,s.tot=;
for(int i=n;i>=;i--)
{
L=((g-dis[i])%ma+ma)%ma;
R=((g+r--dis[i])%ma+ma)%ma;
w=((-dis[i])%ma+ma)%ma;
x=s.query(w,,ma-,root);
f[i]=f[x]+(x?ma-(dis[x]-dis[i])%ma:);
if(L<=R){
s.update(L,R,,ma-,root,i);
}else{
s.update(,R,,ma-,root,i);
s.update(L,ma-,,ma-,root,i);
}
}
int Q;
scanf("%d",&Q);
for(int q=;q<=Q;q++)
{
scanf("%d",&x);
y=s.query(x%ma,,ma-,root);
ll ret;
if(!y) ret=x+tot;
else ret=tot+f[y]+x+(ma-(x+dis[y])%ma);
printf("%lld\n",ret);
}
return ;
}

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

  1. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

  2. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. BZOJ 3779: 重组病毒(线段树+lct+树剖)

    题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...

  5. BZOJ 3123 森林(函数式线段树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3123 题意: 思路:总的来说,查询区间第K小利用函数式线段树的减法操作.对于两棵树的合并 ...

  6. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

  7. Bzoj 3747: [POI2015]Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 222[Submit][Stat ...

  8. BZOJ 3155: Preprefix sum( 线段树 )

    刷刷水题... 前缀和的前缀和...显然树状数组可以写...然而我不会, 只能写线段树了 把改变成加, 然后线段树维护前缀和, 某点p加, 会影响前缀和pre(x)(p≤x≤n), 对[p, n]这段 ...

  9. bzoj 1307/1318 玩具 线段树+记录时间戳

    玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 743  Solved: 404[Submit][Status][Discuss] Descrip ...

随机推荐

  1. ZBrush中Blob点滴笔刷介绍

    对于ZBrush®来说,笔刷的使用时至关重要的,ZBrush中给我们提供了越来越多的笔刷的同时,我们也要根据经验来合理选择笔刷.本文内容小编将分享Blob点滴笔刷的简单介绍,该笔刷在使用时笔头犹如一股 ...

  2. Pyhton学习——Day40

    #一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:# 核心(ECMAScript)# 文档对象模型(DOM) Document object model (整合js,css,ht ...

  3. (fields.E304) Reverse accessor for 'UserProfile.groups' clashes with reverse accessor for 'User.groups'.

    创建数据库models.py,在进行数据迁移时抛出一下异常: E:\Project\GuoJia>python manage.py makemigrations SystemCheckError ...

  4. laravel :Call to undefined function App\Http\Controllers\success() 解决方法

    今天在调用方法时,报错如下:Call to undefined function App\Http\Controllers\success():方法已定义好了,所以我怀疑是未引入function.ph ...

  5. BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)

    题目大意:给你一个无向联通图,节点数n<=1000.聪聪有一个机器人从C点出发向在M点的可可移动,去追赶并吃掉可可,在单位时间内,机器人会先朝离可可最近的节点移动1步,如果移动一步机器人并不能吃 ...

  6. 模板 FFT 快速傅里叶变换

    FFT模板,原理不难,优质讲解很多,但证明很难看太不懂 这模板题在bzoj竟然是土豪题,服了 #include <cmath> #include <cstdio> #inclu ...

  7. jQuery 简单介绍

    jQuery  简单介绍 jQuery的定义 jQuery是一个快速,小巧,功能丰富的JavaScript库.它通过易于使用的API在大量浏览器中运行,使得   HTML文档遍历和操作,事件处理,动画 ...

  8. Python 爬虫练习: 爬取百度贴吧中的图片

    背景:最近开始看一些Python爬虫相关的知识,就在网上找了一些简单已与练习的一些爬虫脚本 实现功能:1,读取用户想要爬取的贴吧 2,读取用户先要爬取某个贴吧的页数范围 3,爬取每个贴吧中用户输入的页 ...

  9. LoadRunner监控Window/Unix系统资源的配置

    LoadRunner监控Window/Unix系统资源需要做两件事情: 1.配置被监视的服务器,以便于LoadRunner能够获取系统资源使用情况的数据 2.在LoadRunner的Controlle ...

  10. Maven导入ojdbc14.jar和ojdbc6.jar

    Maven导入ojdbc14.jar和ojdbc6.jar 学习了:http://blog.csdn.net/johon_medison/article/details/51689690 在 ‘运行’ ...