6.24 区间合并
这部分比较简单
题目:
https://www.acwing.com/problem/content/1345/
https://www.acwing.com/problem/content/424/
二分和区间和并结合:
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
typedef pair<int, int> PII;
PII a[N];
int n, len;
// 需要吧中间时刻转化为时刻用到
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){
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);
}
return dr == len;
}
int main(){
scanf("%d%d", &n, &len);
for(int i = 0; i < n; i ++)
{
int l, s;
scanf("%d%d", &l, &s);
a[i] = {l, s};
}
LL l=1,r = 2e9;
// 二分法 二分的是可满足的时刻;
while(r>l){
LL mid = l + r >> 1; // 相加过程中可能会爆int,记得要开long long
if( check(mid) ) r = mid;
else l = mid + 1;
}
printf("%lld",l);
return 0;
}
本文来自博客园,作者:{yisone},转载请注明原文链接:https://www.cnblogs.com/yisone/p/18265825
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步