蓝桥辅导之管道
-
核心思想:二分
- 二分时间 若t时刻成立 则之后也一定成立
- 将mid时刻时每个阀门的水的流动区间加入对组
- 合并区间 最终判断是否覆盖全管道l==1 && r == m;
-
#include <iostream>#include <cstring>#include <algorithm>#define x first#define y secondusing namespace std;typedef long long LL;typedef pair<int, int> PII;const int N = 100010;PII q[N],w[N];int n,m;bool check(int mid){int cnt=0;for(int i=0;i<n;i++){int L = w[i].x , S = w[i].y; //取出位置和时间if(mid >= S) //说明阀门开了{int t = mid - S; //流动时间int l = max(1,L - t),r = min((LL)m,(LL)L + t); //水的流动区间q[cnt++] = {l,r};}}//合并区间sort(q,q+cnt); int st = -1,ed = -1;for(int i =0;i<cnt;i++){if(q[i].x<=ed+1) ed = max(ed, q[i].y);else st = q[i].x , ed = q[i].y;}return st == 1 && ed == m;}int main(){cin>>n>>m;for(int i=0;i<n;i++) cin>>w[i].x>>w[i].y;LL l = 0,r = 2e9;while(l<r){LL mid = l + r >> 1;if(check(mid)) r = mid;else l = mid + 1;}cout<<l;}