メンテナンス間隔\([L、R]は\ ) の前に終了する\(Iは\)ステップの最小数を使用してステップ間隔の後に落下することができます。
最初間隔\([L、R] \ ) 全体軸の。
最初のため\(Iは\)タスク間隔\([A、B]は\)、2つの間隔からの位相場合、少なくとも必要\((長さ+ 1)/ 2 \) ステップ。
で\(Iは\)タスクが完了した後、間隔\([L、R] \ ) 第1膨張に\(長さ\) 、その後、更新\([L、R]を\ ) と\([A、 B] \)の交差点。
時間の複雑さはある\(O(N)\) 。
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int inf = 1e6;
int t, n;
long long a, b, l, r, dist, ans;
int main()
{
scanf("%d", &t);
for(int cas = 1; cas <= t; cas++){
ans = 0;
l = 0; r = inf;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%lld%lld", &a, &b);
dist = 0;
if(a > r){
dist = (a - r + 1) >> 1;
}
if(b < l){
dist = (l - b + 1) >> 1;
}
ans += dist;
/***l和r实际只需更新一边***/
l -= dist << 1;
r += dist << 1;
l = max(l, a);
r = min(r, b);
}
printf("%lld\n", ans);
}
return 0;
}