站外题求助
  • 板块学术版
  • 楼主fqEason
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/23 20:53
  • 上次更新2023/10/27 06:14:14
查看原帖
站外题求助
723171
fqEason楼主2022/10/23 20:53

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;
}
2022/10/23 20:53
加载中...