题解:二分(要对二分有所了解)
题目来源:https://codeforces.com/contest/1907/problem/D
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <queue>
#define ll long long
#define rep(i,a,n) for(ll i = a; i <= n; i ++)
#define per(i,a,n) for(ll i = n; i >= a; i --)
#define pb push_back
#define IOS std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define PII std::pair<ll,ll>
const ll N = 2e5 + 10;
const ll inf = 998244353;
//注:1073741823的二进制全是1
void solve(){
ll n;
std::cin >> n;
std::vector<PII> op;
rep(i,1,n){
ll a,b;
std::cin >> a >> b;
op.pb({a,b});
}
ll l = 0,r = (1 << 30);//将左端和右端分别初始化足够小和足够大
while(l < r){//直接二分答案
ll l1 = 0,r1 = 0;
ll mid = (l + r) / 2;//先找到中间值
ll ok = 1;//这是判断条件,如果判断之后结果还是1的话就说明所要求得数可以比你现在中间值小,
//反之就必须要大于你的中间值
rep(i,0,n - 1){//遍历一遍
ll xx = op[i].first;
ll yy = op[i].second;
ll mx = l1 - mid;
ll my = r1 + mid;
if(mx > yy || my < xx){//最大可能值比左边界要小或者最小可能值比有边界要大
ok = 0;
break;
}
l1 = std::max(mx,xx);
r1 = std::min(my,yy);
}
if(ok == 1) r = mid;
else l = mid + 1;
}
std::cout << l << "\n";//输出最小可能的答案
return ;
}
int main(){
IOS
ll t;
std::cin >> t;
while(t --)
solve();
return 0;
}