#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
const int N=1e5+10;
int n,m;
PII w[N],q[N];
bool check(int mid){
int cnt = 0;
for(int i=0;i<n;i++){
int l=w[i].first,s=w[i].second;
if(s<=mid){
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].first <= ed+1){
ed = max(ed,q[i].second);
}
else st = q[i].first,ed = q[i].second;
}
return st==1 && ed == m;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d%d",&w[i].first,&w[i].second);
int l=0,r=2e9;
while(l<r){
int mid = (LL)l+r >> 1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d",r);
}
[二分+区间合并]管道(c++实现)
最新推荐文章于 2024-07-25 14:12:37 发布