Sort the intervals from left to right and binary search on the separating distance $D$. For a fixed $D$ we want to check whether we can place at least $N$ cows. This can be done with a greedy strategy; just place each cow at the leftmost position possible. Once the number of cows placed reaches $N$ we can break, so a single $D$ can be checked in $O(N+M)$ time. Thus, the entire solution runs in $O((N+M)\log (\text{max dist}))$ time.
Mark Chen's code:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 2000000000
#define FF first
#define SS second
int n, m;
vector<pair<LL,LL>> intervals;
bool ok(LL d) {
LL prev = -1LL * INF * INF;
int cnt = 0;
for (auto& i : intervals) {
while (max(prev + d, i.FF) <= i.SS) {
prev = max(prev + d, i.FF);
cnt++;
if (cnt >= n) break;
}
if (cnt >= n) break;
}
return (cnt >= n);
}
int main() {
freopen("socdist.in","r",stdin);
freopen("socdist.out","w",stdout);
cin >> n >> m;
intervals.resize(m);
for (int i = 0; i < m; ++i)
cin >> intervals[i].FF >> intervals[i].SS;
sort(intervals.begin(), intervals.end());
LL lo = 1;
LL hi = 1LL * INF * INF;
LL res = -1;
while (lo <= hi) {
LL mid = (lo + hi) / 2;
if (ok(mid)) {
res = mid;
lo = mid + 1;
}
else {
hi = mid - 1;
}
}
cout << res << "\n";
}