模拟考最后一题是这道题,要是数组开大就场切了,最后不小心挂了 \(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. Ubuntu(Linux)虚拟机与主机共享文件夹hgfs文件普通用户不能访问问题

    参考文章: https://blog.csdn.net/weixin_42224577/article/details/108107554 在虚拟机中设置好添加共享文件后,普通用户并不能访问mnt文件 ...

  2. Golang重复Rails Devise gem密码加密

    https://github.com/haimait/go-devise-encryptor package main import ( "fmt" //devisecrypto ...

  3. CSS布局概念与技术教程

    以下是一份CSS布局学习大纲,它涵盖了基本到高级的CSS布局概念和技术 引言 欢迎来到CSS教程!如果你已经掌握了HTML的基础知识,那么你即将进入一个全新的世界,通过学习CSS(Cascading ...

  4. handsontable有显示值与实际值的下拉框cobbobox扩展

    一.效果与使用 二.代码 /// <reference path="handsontable.full.min.js" /> //封闭在IIFE中 (Handsonta ...

  5. win11或win10客户端邮箱账号登录设置

    1.alimall阿里企业邮箱 点击账户 点击添加账户 点击其他账户 输入电子邮箱地址和密码,并点击登录即可 2.Qq邮箱 2.1 点击账户 2.2 点击添加账户 2.3 点击其他账户 2.4 输入电 ...

  6. .NET桌面程序混合开发之二:在原生WinFrom程序中使用WebView2

    本文将介绍如何在WinForms中嵌入WebView2,并讲到WebView2的主要特征.点击了解更多WebView2的API. 1. 准备 Visual Studio 2017 及以上版本 WebV ...

  7. Vue渲染函数与JSX指南

    title: Vue渲染函数与JSX指南 date: 2024/6/3 下午6:43:53 updated: 2024/6/3 下午6:43:53 categories: 前端开发 tags: Vue ...

  8. 【Java】JVM字节码分析

    一.功能 1.工作原理 2.解释和运行 jvm本质上是运行在计算机上的程序,负责运行java字节码文件 对字节码文件中的指令,实时的解释成机器码,供计算机执行 3.内存管理 自动为对象.方法等分配内存 ...

  9. C# 利用Autofac批量接口注入依赖【学习记录】

    背景: 本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式.此写法给我的感觉就是 非常的 优雅 ,优雅永不过时.关于接口注入的概念和ioc和di具体是什么 ...

  10. 前端传参中文需要utf-8转一下给后端

    const Msg = this.form.Msg.replace( (/%(u[0-9A-F]{4})|(%[0-9A-F]{2})/gm, $0 => { return escape($0) ...