打卡信奥刷题(2172)用C++实现信奥 P12380 [蓝桥杯 2023 省 Python B] 管道
·
P12380 [蓝桥杯 2023 省 Python B] 管道
题目描述
有一根长度为 lenlenlen 的横向的管道,该管道按照单位长度分为 lenlenlen 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。
一开始管道是空的,位于 LiL_iLi 的阀门会在 SiS_iSi 时刻打开,并不断让水流入管道。
对于位于 LiL_iLi 的阀门,它流入的水在 Ti(Ti≥Si)T_i (T_i \geq S_i)Ti(Ti≥Si) 时刻会使得从第 Li−(Ti−Si)L_i - (T_i - S_i)Li−(Ti−Si) 段到第 Li+(Ti−Si)L_i + (T_i - S_i)Li+(Ti−Si) 段的传感器检测到水流。
求管道中每一段中间的传感器都检测到有水流的最早时间。
输入格式
输入的第一行包含两个整数 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 200n≤200,Si,len≤3000S_i, len \leq 3000Si,len≤3000;
- 对于 70%70\%70% 的评测用例,n≤5000n \leq 5000n≤5000,Si,len≤105S_i, len \leq 10^5Si,len≤105;
- 对于所有评测用例,1≤n≤1051 \leq n \leq 10^51≤n≤105,1≤Si,len≤1091 \leq S_i, len \leq 10^91≤Si,len≤109,1≤Li≤len1 \leq L_i \leq len1≤Li≤len,Li−1<LiL_{i-1} < L_iLi−1<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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐


所有评论(0)