模拟考最后一题是这道题,要是数组开大就场切了,最后不小心挂了 \(15\) 分。

以下是考场思路:

考虑这样一个问题,所有时间对 \(r+g\) 取余是可以的。毕竟红绿灯是一个循环。

再考虑这样一个东西,等过一次红灯后的所有情况是相似的,从循环的角度出发都是时刻 \(0\)。

因此考虑处理出出发之后第一次遇到红绿灯的点,然后问题就变成从一个路口到终点,可以使用一次 \(n^2\) 的 dp 完成。

接下来先考虑如何处理第一次遇到红绿灯的点。

假若需要从之前的路口走到这个路口需要花费时间 \(x\) 那么满足以下条件的出发时间 可能 会在这个点第一次遇到红绿灯。

\[t + x < g (\bmod (r+g))
\]

第一次遇到红绿灯的点就是最小的 \(x\)。

实际上满足条件的 \(t\) 根据与 \(g\) 的大小关系构成至多两段区间,考虑动态开点权值线段树维护区间取最小值和单点查询。

接下来考虑如何优化上面那个 \(n^2\) 的 dp 我们可以发现等完红绿灯出发与从起点出发的情况实际上是类似的,倒着扫描一遍且与上面那种情况类似的用线段树维护即可。

注意空间不要开小了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+114;
const int inf = 1e9+114;
int tr[maxn*70+1],tag[maxn*70+1],ls[maxn*70+1],rs[maxn*70+1],tot;
long long l[maxn],pre[maxn],dp[maxn];
long long cost[maxn];
long long G,R,n,q;
void pushdown(long long cur){
if(ls[cur]==0) ls[cur]=++tot;
if(rs[cur]==0) rs[cur]=++tot;
tr[ls[cur]]=min(tr[ls[cur]],tag[cur]);
tr[rs[cur]]=min(tr[rs[cur]],tag[cur]);
tag[ls[cur]]=min(tag[ls[cur]],tag[cur]);
tag[rs[cur]]=min(tag[rs[cur]],tag[cur]);
tag[cur]=inf;
}
void pushup(long long cur){
tr[cur]=min(tr[ls[cur]],tr[rs[cur]]);
}
void update(int &cur,long long lt,long long rt,long long l,long long r,int v){
if(lt>rt) return ;
if(l>rt||r<lt) return;
if(cur==0) cur=++tot;
if(l<=lt&&rt<=r){
tr[cur]=min(tr[cur],v);
tag[cur]=min(tag[cur],v);
return ;
}
long long mid=(lt+rt-1)>>1;
pushdown(cur);
update(ls[cur],lt,mid,l,r,v);
update(rs[cur],mid+1,rt,l,r,v);
pushup(cur);
}
long long query(long long cur,long long lt,long long rt,long long l,long long r){
if(l>rt||r<lt||cur==0) return inf;
if(l<=lt&&rt<=r) return tr[cur];
long long mid=(lt+rt-1)>>1;
pushdown(cur);
return min(query(ls[cur],lt,mid,l,r),query(rs[cur],mid+1,rt,l,r));
}
int rt;
void init(){
for(long long i=1;i<=n;i++) pre[i]=(pre[i-1]+l[i])%(G+R),cost[i]=cost[i-1]+l[i];
for(long long i=0;i<maxn*70;i++) tr[i]=tag[i]=inf;
dp[n+1]=0;
for(int i=n;i>=1;i--){
long long x=(G+R-pre[i])%(G+R);
long long y=query(rt,0,G+R-1,(x)%(G+R),(x)%(G+R));
if(y<inf) dp[i]=dp[y]+(cost[y]-cost[i]+((G+R)-((cost[y]-cost[i])%(G+R))));
else dp[i]=cost[n]-cost[i]+l[n+1];
if(pre[i]<=G){
update(rt,0,G+R-1,G-pre[i],R+G-1-pre[i],i);
}
else{
update(rt,0,G+R-1,0,R+G-1-pre[i],i);
update(rt,0,R+G-1,G+R-pre[i]+G,R+G-1,i);
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>G>>R;
for(long long i=1;i<=n+1;i++) cin>>l[i];
init();
cin>>q;
while(q--){
long long x;
cin>>x;
long long st=query(rt,0,G+R-1,x%(G+R),x%(G+R));
if(st==inf){
cout<<x+cost[n]+l[n+1]<<'\n';
}
else{
long long res=cost[st]+x+((G+R)-((cost[st]+x)%(G+R)));
res+=dp[st];
cout<<res<<'\n';
}
}
return 0;
}
/*
4 5 1
12 18 4 6 7
5
4
11
5
3
2
*/

CF187D 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. leaflet利用hotline实现河流差值渲染热力图

    实现效果(这里做了1条主河道和5个支流): 核心代码使用了Leaflet.hotline插件,github下载地址链接 详情见我之前整理的一篇文章介绍河流热力图 核心代码逻辑: // 处理河流数据以及 ...

  2. 促双碳|AIRIOT智慧能源管理解决方案

      随着"双碳"政策和落地的推进,各行业企业围绕实现碳达峰和碳中和为目标,逐步开展智能化能源管理工作,通过能源数据统计.分析.核算.监测.能耗设备管理.碳资产管理等多种手段,对能源 ...

  3. openssl 生成多域名 多IP 的数字证书

    openssl.cnf 文件内容: [req] default_bits = 2048 distinguished_name = req_distinguished_name copy_extensi ...

  4. 一文详解编辑距离(Levenshtein Distance)

    更多博文请关注:https://blog.bigcoder.cn 一. 什么是Levenshtein Distance Levenshtein Distance,一般称为编辑距离(Edit Dista ...

  5. 『手撕Vue-CLI』添加终端用户交互

    前言 经过上一篇文章的梳理,实现了可以从 GitHub 上拉取模板项目名称,已经可以得知可使用的模板有哪些了,那么我觉得是不是要进行选择呢?所以这一篇文章就来实现终端用户交互,让用户可以自己选择想要使 ...

  6. HTML——input标签

    很多表单元素都是由一个个的 input 元素组成的.它是自闭合标签,根据其 type 属性值的不同分为很多种,例如单行文本框.密码框.单选按钮.复选框.隐藏域.文件上传域.普通按钮.提交按钮以及重置按 ...

  7. MySQL查看实时执行的SQL语句

    MySQL默认不能实时查看执行的SQL语句,因为这会消耗一定的资源. 要开启这个功能,稍微配置一下,打开这个LOG记录就可以了. 1 查看LOG功能 首先,查看是否已经开启实时SQL语句记录. mys ...

  8. 中国十大IT技术社区,你都知道哪些?

    中国5大新型IT技术社区与5大传统IT技术社区,你都知道哪些? 社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的 ...

  9. autojs拉人进群

    /* 微信 version:8.0.1 语言:AutoJs [https://hyb1996.github.io/AutoJs-Docs/#/] @author:奔跑的前端猿 */ auto.wait ...

  10. windows隐藏文件如何查看

    1.组织 2.查看 3.显示隐藏文件