BZOJ 5254 [Fjwc2018]红绿灯 (线段树)
题目大意:一个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]红绿灯 (线段树)的更多相关文章
- Bzoj 2752 高速公路 (期望,线段树)
Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...
- BZOJ.3938.Robot(李超线段树)
BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- BZOJ 3779: 重组病毒(线段树+lct+树剖)
题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...
- BZOJ 3123 森林(函数式线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3123 题意: 思路:总的来说,查询区间第K小利用函数式线段树的减法操作.对于两棵树的合并 ...
- BZOJ 2124等差子序列 线段树&&hash
[题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...
- Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ...
- BZOJ 3155: Preprefix sum( 线段树 )
刷刷水题... 前缀和的前缀和...显然树状数组可以写...然而我不会, 只能写线段树了 把改变成加, 然后线段树维护前缀和, 某点p加, 会影响前缀和pre(x)(p≤x≤n), 对[p, n]这段 ...
- bzoj 1307/1318 玩具 线段树+记录时间戳
玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 743 Solved: 404[Submit][Status][Discuss] Descrip ...
随机推荐
- Pyhton学习——Day60
Form组件 - form表单(验证:保留上次内容) - - Ajax(验证:无需上次内容) - 返回HttpResponse - 前端:跳转或错误信息 1. Form组件扩展: 1.简单扩展 利用F ...
- 百度api使用说明
.初始化地图,并设置地图中心点 复制代码 https://www.cnblogs.com/zqzjs/p/5293698.html var map = new BMap.Map("allma ...
- Multipartfile与File类型相互转换
特殊情况下需要做转换 1.M转F File file = new File(path); FileUtils.copyInputStreamToFile(multipartFile.getInputS ...
- CF487E Tourists(圆方树+堆+链剖)
本题解并不提供圆方树讲解. 所以不会圆方树的出门右转问yyb 没有修改的话圆方树+链剖. 方点的权值为点双连通分量里的最小值. 然后修改的话圆点照修,每一个方点维护一个小根堆. 考虑到可能被菊花卡死. ...
- HDU1420 - Prepared for New Acmer
集训进行了将近2个礼拜,这段时间以恢复性训练为主,我一直在密切关注大家的训练情况,目前为止,对大家的表现相当满意,首先是绝大部分队员的训练积极性很高,其次,都很遵守集训纪律,最后,老队员也起到了很好的 ...
- [JZOJ]100047. 【NOIP2017提高A组模拟7.14】基因变异
21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的变异息息相关,考察基因变 ...
- pytorch 8 CNN 卷积神经网络
# library # standard library import os # third-party library import torch import torch.nn as nn impo ...
- 前端通过canvas实现图片压缩
在一次的项目中,需要用户上传图片,目前市场随便一个手机拍出来的照片都是好几兆,直接上传特别占用带宽,影响用户体验,所以要求对用户上传图片进行压缩后再上传:那么前端怎么实现这个功能呢? 亲测可将4M图片 ...
- 2015 Multi-University Training Contest 6 hdu 5358 First One
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- Android实战简易教程-第十三枪(五大布局研究)
我们知道Android系统应用程序通常是由多个Activity组成,而这些Activity以视图的形式展如今我们面前, 视图都是由一个一个的组件构成的. 组件就是我们常见的Button.TextEdi ...