假设某人要乘坐电梯,从楼层 到楼层 ,若电梯停靠位置 在 之间,则电梯移动距离为。
若停靠位置在 ,则电梯要多移动 2 距离。若停靠位置在 ,则电梯要多移动 4 距离。我们可
以发现,停靠位置从 到 1,电梯多移动的距离呈公差为 2 的等差数列。
我们假设 表示电梯停靠在 的总移动距离,那么给定 的时候,相当于将整个数组全部加
,并且将 到 1 的位置额外加一个公差为 2 的等差数列;同理,将 到 的位置加一个公差为 2 的等差数列
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, m, a, b;
long long ans = 1e18, pos, sum = 0;
cin >> n >> m;
vector<long long>pre(n+2), suf(n+2), pre1(n+2), suf1(n+2);
while(m--){
cin >> a >> b;
pre[a-1] += 2;
suf[b+1] += 2;
sum += (b - a) * 2;
}
for(int i = n; i >= 1; i--){
pre[i] += pre[i+1];
pre1[i] = pre1[i+1] + pre[i];
}
for(int i = 1; i <= n; i++){
suf[i] += suf[i-1];
suf1[i] += suf1[i-1] + suf[i];
if(suf1[i] + pre1[i] < ans){
pos = i;
ans = suf1[i] + pre1[i];
}
}
cout << pos << " " << ans + sum << endl;
}