CF187D 题解
模拟考最后一题是这道题,要是数组开大就场切了,最后不小心挂了 \(15\) 分。
以下是考场思路:
考虑这样一个问题,所有时间对 \(r+g\) 取余是可以的。毕竟红绿灯是一个循环。
再考虑这样一个东西,等过一次红灯后的所有情况是相似的,从循环的角度出发都是时刻 \(0\)。
因此考虑处理出出发之后第一次遇到红绿灯的点,然后问题就变成从一个路口到终点,可以使用一次 \(n^2\) 的 dp 完成。
接下来先考虑如何处理第一次遇到红绿灯的点。
假若需要从之前的路口走到这个路口需要花费时间 \(x\) 那么满足以下条件的出发时间 可能 会在这个点第一次遇到红绿灯。
\]
第一次遇到红绿灯的点就是最小的 \(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 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 模型压缩与部署-书生浦语大模型实战营学习笔记5&大语言模型11
大语言模型-11.模型压缩与部署 书生浦语大模型实战营学习笔记4-模型压缩与部署 本文包括第二期实战营的第5课内容,介绍关于模型压缩的相关内容,主要包括.模型量化和模型部署的相关内容. 模型部署 定义 ...
- SpringBoot 利用Timer 在指定时间2小时后执行任务
/** * @Description * @Author songwp * @Date 2022/8/5 12:51 * @Version 1.0.0 **/ @Component public cl ...
- List集合中获取重复元素
一.方法1 ## 测试数据 List<String> words = Arrays.asList("a", "b", "c", ...
- 智能工作流:Spring AI高效批量化提示访问方案
基于SpringAI搭建系统,依靠线程池\负载均衡等技术进行请求优化,用于解决科研&开发过程中对GPT接口进行批量化接口请求中出现的问题. github地址:https://github.co ...
- 4G EPS 中的小区搜索
目录 文章目录 目录 前文列表 小区搜索(Cell Search)流程 PSS(主同步信号)与 SSS(辅同步信号) DL-RS(下行参考信号) PBCH(物理广播信道) PDSCH(物理下行共享信道 ...
- 什么是Java线程池
摘自:某个百度知道 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在 ...
- vue学习笔记之父组件子组件的传值
一 在前端开发过程中,很多情况下一个页面无法装载大部分的代码,所以需要子组件来完成父组件的任务,下面我来展示一下,组件之间如何进行传值以及常见的坑,首先上代码 1.1 父组件代码 <tem ...
- 模拟重装Kubernetes(k8s)集群:删除k8s集群然后重装
目录 一.系统环境 二.前言 三.重装Kubernetes集群 3.1 环境介绍 3.2 删除k8s所有节点(node) 3.3 kubeadm初始化 3.4 添加worker节点到k8s集群 3.5 ...
- 华为云大咖说:开发者应用AI大模型的“道、法、术”
本文分享自华为云社区<华为大咖说 | 企业应用AI大模型的"道.法.术" --道:认知篇>,作者:华为云PaaS服务小智. 本期核心观点 上车:AGI是未来5-10年内 ...
- 深度学习论文翻译解析(二十二):Uniformed Students Student-Teacher Anomaly Detection With Discriminative Latent Embbeddings
论文标题:Uniformed Students Student-Teacher Anomaly Detection With Discriminative Latent Embbeddings 论文作 ...