题解:AT_abc395_f [ABC395F] Smooth Occlusion
_7thRC_CB_CRP_ · · 题解
首先无论你如何据牙齿,最后的答案都是
所以说我们只需要找到一最大的
显然对于一个
那现在只需要考虑为
那么既然知道
而如果任何一颗上牙的取值为空集,那么则无法锯掉,否则可以。
即可完成此题。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll n, x;
ll u[200001], d[200001];
bool check(ll h) {
ll l =0, r =3000000000;
for (int i = 1; i <= n; i++) {
l = max(max(h - d[i], 0ll), l - x);
r = min(min(u[i], h), r + x);//计算取值范围
if(l>r)
return 0;//判定是否可行
}
return 1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin>>n>>x;
ll sum=0;
for(int i=1;i<=n;i++)
cin>>u[i]>>d[i],sum+=u[i]+d[i];//计算总长度
ll l=0,r=3000000000;
while(l<r) {
ll mid=(l+r)/2;
if(check(mid+1)) l=mid+1;
else r=mid;
}//二分
cout<<sum-n*l;//输出答案
}