首页 > 其他分享 >CF187D BRT Contract

CF187D BRT Contract

时间:2023-08-08 17:55:09浏览次数:28  
标签:rt 红灯 int BRT tr Contract Query CF187D mod

Problem

泰迪每天都要通过一条路从家到学校,这条路的起点是泰迪家,终点则是学校。

这条路中间还有 \(n\) 个路口,从第 \(i - 1\) 个路口走到第 \(i\) 个路口需要 \(d_i\) 秒,每个路口都有一个红绿灯。更具体地,绿灯持续时间是 \(g\) 秒,红灯持续时间是 \(r\) 秒。每天从第 \(0\) 秒开始,所有灯都是绿灯,持续 \(g\) 秒之后变为红灯,再过 \(r\) 秒变成绿灯,以此类推,并且同一时刻所有灯都是相同状态。当泰迪到达一个路口,若是绿灯则可直接通过,若是红灯则需原地等待至绿灯。若到达某一路口时灯的状态正好发生改变,则视到达路口时灯的颜色为其改变后的颜色,例如第 \(g\) 秒到达一个路口则视为遇到红灯。

现在泰迪预计了接下来 \(q\) 天从家出发的时间,第 \(j\) 天将会在第 \(t_j\) 秒从家出发,他希望你告诉他每天到达学校的最早时间。你可以假定一天内泰迪一定可以到达学校。

保证 \(n, q \leq 10^5, 2 \leq g, r \leq 10^9, d_i, t_j \leq 10^9\)。

Input

一行三个整数 \(n,g,r\)。

一行 \(n+1\) 个整数 \(d_i\),表示从第 \(i-1\) 到第 \(i\) 个需要的时间,注意,第 \(0\) 个路口是家,第 \(n+1\) 个路口是学校。

一行一个整数 \(q\),表示询问数。

\(q\) 行,每行一个整数 \(t_j\)表示出发时间。

Output

\(q\) 行,表示最早到达学校的时间。

Sample

Input 1

1 3 2
5 2
5
1
2
3
4
5

Output 1

8
9
12
12
12

Input 2

5 3 7
10 1 1 8 900000005 1000000000
3
1
10
1000000000

Output 2

1900000040
1900000040
2900000030

Solution

首先如果直接模拟是肯定不可行的,所以一定存在一个优美的性质。不难发现因为所有红绿灯都是同步的,所以一旦在某一位置停下来等红灯,后续的时间开销是固定的

于是考虑预处理这一部分,定义 \(f_i\) 表示从第 \(i\) 个位置出发,起始时刚好绿灯亮起,到终点的时间。然后转移,我们要找到 \(i\) 后第一个等红灯的位置,记为 \(j\)。

  1. 如果 \(j = n + 1\),说明不需要等红灯,\(f_i = Dis(i,n + 1)\),\(i\) 到 \(n+1\) 的距离可以前缀和作差得到。

  2. 如果 \(j \neq n+1\),说明 \(i\) 后第一次等红灯的位置是 \(j\),那么 \(j\) 满足 \(Dis(i,j)\) 对 \((g+r)\) 取模后的值 \(\geq g\)。显然,使 \((t+f_i)\) 对 \((g+r)\) 取模后的值 \(\geq g\) 的 \(t\) 的范围是区间,可以用线段树进行区间查询。对于已经计算过的 \(f\) 值,将它插入线段树中,便于后续计算。

对于每一个询问的时间 \(t\),我们可以区间查询找到第一个等红灯的位置 \(i\),那么答案就是 \(t + Dis(0,i) + t' + f_i\),其中 \(t'\) 表示在第 \(i\) 个位置等红灯的时间。

注意到值域很大,线段树要使用动态开点。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int kmax = 1e6 + 3;

struct T {
	int ls, rs;
	int s;
} tr[kmax * 5];

long long n, m, t, s[kmax];
long long g, r, mod;
int ct, rt;
long long f[kmax];

int Add() {
	tr[++ct].s = n + 1;  // 初始化
	return ct; 
}

void Pushup(int x) {
	if(!tr[x].ls) tr[x].ls = Add();
	if(!tr[x].rs) tr[x].rs = Add();
	tr[x].s = min(tr[tr[x].ls].s, tr[tr[x].rs].s);
}

void Modify(int &x, int l, int r, int k, int v) {
	if(!x) x = Add(); // 动态开点
	if(l == r) {
		tr[x].s = v;
		return;
	}
	int mid = (l + r) >> 1;
	if(k <= mid) {
		Modify(tr[x].ls, l, mid, k, v);
	} else {
		Modify(tr[x].rs, mid + 1, r, k, v);
	}
	Pushup(x);
}

int Query(int x, int l, int r, int _l, int _r) {
	if(!x) return n + 1; // 没有这个节点
	if(_l <= l && r <= _r) return tr[x].s;
	int tot = n + 1;
	int mid = (l + r) >> 1;
	if(_l <= mid) tot = min(tot, Query(tr[x].ls, l, mid, _l, _r));
	if(_r > mid) tot = min(tot, Query(tr[x].rs, mid + 1, r, _l, _r));
	return tot;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> g >> r;
	mod = g + r; // 灯的周期
	for(int i = 1; i <= n + 1; i++) {
		cin >> s[i];
		s[i] += s[i - 1]; // 求前缀
	}
	for(int i = n, j; i; i--) {
		t = mod - s[i] % mod;
		if(g >= t) {
			j = Query(rt, 0, mod - 1, g - t, mod - 1 - t);
		} else {
			j = min(Query(rt, 0, mod - 1, 0, mod - 1 - t), Query(rt, 0, mod - 1, g - t + mod, mod - 1));
		}
		if(j == n + 1) {
			f[i] = s[n + 1] - s[i]; // 没有红灯
		} else {
			f[i] = f[j] + s[j] - s[i] + mod - (s[j] - s[i]) % mod; // 有红灯
		}
		Modify(rt, 0, mod - 1, s[i] % mod, i); // 单点修改
//		cout << i << ' ' << f[i] << '\n';
	}
	cin >> m;
	for(int i = 1, j, x; i <= m; i++) {
		cin >> x;
		t = x % mod;
		if(g >= t) {
			j = Query(rt, 0, mod - 1, g - t, mod - 1 - t);
		} else {
			j = min(Query(rt, 0, mod - 1, 0, mod - 1 - t), Query(rt, 0, mod - 1, g - t + mod, mod - 1)); // 两个区间
		}
		if(j == n + 1) {
			cout << x + s[n + 1] << '\n'; // 没有红灯
		} else {
			cout << x + s[j] + f[j] + mod - (s[j] + x) % mod << '\n'; // 有红灯
		}
	}
	return 0;
}

标签:rt,红灯,int,BRT,tr,Contract,Query,CF187D,mod
From: https://www.cnblogs.com/ereoth/p/17615035.html

相关文章

  • WebRTC 显示RTSP视频流
    网页显示视频的两种方式: 1.使用Vlc插件,浏览器限制火狐50,51 版本。文件见上传。<objecttype="application/x-vlc-plugin"id="vlc3"events="True"style="width:300px;height:300px;"><paramname="mrl"id="mr10......
  • Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP
    一对一音视频通话使用场景一对一音视频通话都需要稳定、清晰和流畅,以确保良好的用户体验,常用的使用场景如下:社交应用:社交应用是一种常见的使用场景,用户可以通过音视频通话进行面对面的交流;在线教育:老师和学生可以通过音视频通话功能进行实时互动,提高教学效率;远程协助:在某些工作场景......
  • 视频监控汇聚平台EasyCVR视频页面WebRTC流地址播放不了是什么原因?
    开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控汇聚平台EasyCV......
  • WebRTC研究:RTP报头扩展
    RTPHeaderRTP协议中,RTPHeader(报头)包括固定报头(FixedHeader)与报头扩展(Headerextension,可选)。RTPFixedHeader结构如下,其中前12字节是每个RTP包必须包含的。01230123456789012345678......
  • WebRTC研究:Transport-cc之RTP及RTCP
    Transport-cc指的是Transport-wideCongestionControl。WebRTC最新的拥塞控制算法(SendsideBWE)基于Transport-cc,接收端记录数据包到达时间,构造相关RTCP包,然后反馈给发送端,在发送端做带宽估计,从而进行拥塞控制。之所以基于Transport-cc,放到发送端进行带宽估计,除了方便维护,也增加了......
  • ZLMediaKit WebRTC用法介绍
    一、WebRTC简介WebRTC是一个开源的实时通信技术,它支持浏览器和原生应用程序之间的实时音频/视频通信。WebRTC为音频和视频的传输提供了支持,也为数据的传输提供了支持,使得开发者可以用较少的代码来实现实时通信的功能。二、ZLMediaKitWebRTC介绍ZLMediaKit是一个开源的流媒体服务框......
  • Game as a Service —— 开源云游戏搭载WebRTC
    软件即服务,基础架构即服务,平台即服务,通信平台即服务,视频会议即服务,那么,游戏即服务(GameasaService)如何呢?已经有不少科技公司试水云游戏,最著名的要数Google的Stadia。对WebRTC来说,Stadia已经算是老朋友了,但是其他云游戏也能以同样的方式运用WebRTC吗?ThanhNguyen研究了他自己的开......
  • 流媒体协议之WebRTC简易服务器搭建20230726
    流媒体协议之WebRTC简易服务器搭建1.简介        由于官网的peerconnection_server和apprtc对SDP以及登录流程有特定要求,不便于调试自己实现的WebRTC,所以计划自己搭建服务器,网上开源的服务器有很多:licode/janus/kurento/mediasoup/jitsi等等,但是这些服务器的搭建又比较......
  • RTMP流媒体服务器LntonMedia(免费)平台利用srs通过webrtc推流到LntonMedia平台的具体操
    WebRTC属于开源的即时通信技术,它实现了基于网页的语音对话或及视频通话,目的是无插件实现web端的实时通信能力,其中包含视频音频采集、编解码、数据传输、音视频展示等功能。LntonMedia也是基于WebRTC技术的互联网视频云服务平台,具有视频直播、点播、视频拉转推、时移、视频回看等功......
  • 实现在Vue应用中播放实时视频,使用WebRTC技术和Canvas API来完成
    要实现在Vue应用中播放实时视频,您需要使用WebRTC技术和CanvasAPI来完成。下面是基本的实现步骤:1.使用getUserMediaAPI获取用户的摄像头和麦克风访问权限;javascript复制代码navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(function(stream){//......