题解:P14774 [ICPC 2024 Seoul R] Street Development
题意
数轴上有
每个小机器人有独一无二的信息,两个小机器人在同样的整数坐标时信息会合并,求最后能使得某个机器人拥有所有信息需要的最小初始电量。
题解
首先两个机器人一旦相遇,剩余电量低的就不用动了。
我最开始想的策略是最左侧的机器人从左往右合并信息,和其它小机器人相遇时相当于补充电量。这样答案为
问题出在机器人可以折返跑。二分初始电量
但是这样还是会假,答案会莫名其妙多
对于不可能达到的情况,
代码
#include<iostream>
#include<vector>
using namespace std;
long long a[2000001];
long long L;
int n;
long long ml[2000001],mr[2000001];
bool check(int P){
ml[1]=P;
for(int i=2;i<=n;i++){
if(a[i]>ml[i-1]+P){
ml[i]=-L-1;
} else{
ml[i]=a[i]+P-2*max(0ll,a[i]-ml[i-1]);
}
}
mr[n]=L-P;
for(int i=n-1;i>=1;i--){
if(a[i]<mr[i+1]-P){
mr[i]=L+1;
} else{
mr[i]=a[i]-P+2*max(0ll,mr[i+1]-a[i]);
}
}
for(int i=1;i<n;i++){
if(mr[i+1]<=ml[i]){
return true;
}
}
return false;
}
int main(){
cin >> L >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
int l=0,r=L;
while(l<r){
auto mid=(l+r)>>1;
if(check(mid)){
r=mid;
} else{
l=mid+1;
}
}
cout << r;
return 0;
}