马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int N=1e5+10;
// 考察二分跟区间合并
int n,len;
pii a[N];
bool check(ll mid)
{
vector<pii>segs;
for(int i=0;i<n;i++)
{
int l=a[i].first,s=a[i].second;
if(s>mid) continue; // 如果当前时刻大于找到的时刻就要跳过
// 计算每个水闸能检测的范围
int left=max(1ll,l-mid+s),right=min((ll)len,l+mid-s);
segs.push_back({left,right});
}
int cnt =segs.size();
sort(segs.begin(),segs.end()); // 按照左端点从小到大排序
if(segs.empty()) return false;
if(segs[0].first>1) return false;
int dr =segs[0].second;
for(int i=1;i<cnt;i++)
{
if(segs[i].first>dr+1)return false;
dr=max(dr,segs[i].second,dr);
}
return dr==len;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>len;
for(int i=0;i<n;i++)
{
int l,s;
cin>>l>>s;
a[i]={l,s};
}
ll l=0,r=2e9;
while(l+1<r) // 二分找答案
{
ll mid =l+r>>1; // 可能会报int,应该用long long
if(check(mid)) r=mid;
else l=mid;
}
cout<<l<<endl;
}
为什么会编译错误啊,没找到原因,修改一下代码 |