RT,题目如下
有 M 个互不相交的区间( 1≤M≤10e5 ),左右端点均为整数(区间包括左右端点),在这些区间内选择 N ( 2≤N≤10e5 )个整点(坐标为整数),使得任意相邻两点之间的最小距离尽可能远,问这个最远的距离是多少?
10pts WA代码
#include <bits/stdc++.h>
using namespace std;
inline long long read() {
char ch=getchar();
long long x=0,f=1;
while(!isdigit(ch)) {
if (ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)) {
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
int n,m;
struct line{
long long l,r;
}f[100001];
long long maxn;
bool cmp(line a, line b) {
return a.l<b.l;
}
bool check(long long x) {
long long now=f[1].l;
int need=n-1;
if (need==0) return true;
for (int i=1;i<=m;i++) {
int cha=f[i].r-now;
cha/=x;
need-=cha;
if (need<=0) return true;
now+=cha*x;
if (now+x>=f[i+1].l) now+=x;
else now=f[i+1].l;
if (now>maxn||i==m) return false;
need--;
if (need<=0) return true;
}
return false;
}
int main() {
n=read(),m=read();
for (int i=1;i<=m;i++) f[i].l=read(),f[i].r=read(),maxn=max(maxn,f[i].r);
sort(f+1,f+1+m,cmp);
long long l=1,r=maxn,ans=0;
while(l<=r) {
long long mid=(l+r)>>1;
if (check(mid)) {
l=mid+1;
ans=mid;
}
else {
r=mid-1;
}
}
cout << ans;
return 0;
}