题解
题意:n轮游戏,每轮有一个区间的灯泡亮起,一开始人处在x的位置上,每轮游戏开始之前可以移动位置,代价是 ∣ p o x n e w − p o s o l d ∣ |pox_{new}-pos_{old}| ∣poxnew−posold∣ ,每轮游戏花费的代价是当前位置到最近的灯泡的距离,问n轮游戏后最小代价和
Bubble Cup 8 finals F. Bulbo (575F)
从当前位置到灯泡区间,有一个最优区间,在这个区间内所需的代价都是一样的,所以维护这个最优区间就行了,
当人所在的区间
[
l
,
r
]
[l,r]
[l,r]包含在灯泡区间
[
L
,
R
]
[L,R]
[L,R]内,最优区间为当前人所在区间
当所在的区间
[
l
,
r
]
[l,r]
[l,r]与灯泡区间
[
L
,
R
]
[L,R]
[L,R]有部分重叠,最有区间取重叠部分
当所在的区间
[
l
,
r
]
[l,r]
[l,r]与灯泡区间
[
L
,
R
]
[L,R]
[L,R]没有重叠,最优区间在端点到最近灯泡区间端点的那一段里
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, l, r;
int main() {
ios::sync_with_stdio(0);
cin >> n;
cin >> l;
r = l;
ll ans = 0;
for (int i = 1; i <= n; ++i) {
int L, R;
cin >> L >> R;
if (L <= l && r <= R)continue;
if (R <= l) {
ans += l - R;
r = l;
l = R;
} else if (r < L) {
ans += L - r;
l = r;
r = L;
} else {
l = max(L, l);
r = min(r, R);
}
}
cout << ans << endl;
return 0;
}