P12380 [蓝桥杯 2023 省 Python B] 管道

题目描述

有一根长度为 lenlenlen 的横向的管道,该管道按照单位长度分为 lenlenlen 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。

一开始管道是空的,位于 LiL_iLi 的阀门会在 SiS_iSi 时刻打开,并不断让水流入管道。

对于位于 LiL_iLi 的阀门,它流入的水在 Ti(Ti≥Si)T_i (T_i \geq S_i)Ti(TiSi) 时刻会使得从第 Li−(Ti−Si)L_i - (T_i - S_i)Li(TiSi) 段到第 Li+(Ti−Si)L_i + (T_i - S_i)Li+(TiSi) 段的传感器检测到水流。

求管道中每一段中间的传感器都检测到有水流的最早时间。

输入格式

输入的第一行包含两个整数 n,lenn, lenn,len,用一个空格分隔,分别表示会打开的阀门数和管道长度。

接下来 nnn 行每行包含两个整数 Li,SiL_i, S_iLi,Si,用一个空格分隔,表示位于第 LiL_iLi 段管道中央的阀门会在 SiS_iSi 时刻打开。

输出格式

输出一行包含一个整数表示答案。

输入输出样例 #1

输入 #1

3 10
1 1
6 5
10 2

输出 #1

5

说明/提示

评测用例规模与约定

  • 对于 30%30\%30% 的评测用例,n≤200n \leq 200n200Si,len≤3000S_i, len \leq 3000Si,len3000
  • 对于 70%70\%70% 的评测用例,n≤5000n \leq 5000n5000Si,len≤105S_i, len \leq 10^5Si,len105
  • 对于所有评测用例,1≤n≤1051 \leq n \leq 10^51n1051≤Si,len≤1091 \leq S_i, len \leq 10^91Si,len1091≤Li≤len1 \leq L_i \leq len1LilenLi−1<LiL_{i-1} < L_iLi1<Li

C++实现

#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
int n, len, ans = 2e9 + 1;
int L[N], S[N];
void solve() {
	ll l = 1, r = 2e9 + 1;
	while (l < r) {
		ll mid = (l + r) >> 1;
		ll lp = 0;
		for (int i = 1; i <= n; i++) {
			if (S[i] <= mid) {
				if (lp >= L[i] - (mid - S[i]) - 1) {
					lp = max(lp, L[i] + (mid - S[i]));
				}
			}
			if (lp >= len)break;
		}
		if (lp < len)l = mid + 1;
		else r = mid;
	}
	ans = l;
}
int main() {
	cin >> n >> len;
	for (int i = 1; i <= n; i++) {
		cin >> L[i] >> S[i];
	}
	solve();
	cout << ans << '\n';
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐