-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsocdist.cpp
57 lines (54 loc) · 1.28 KB
/
socdist.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
bool works(ll N, ll M, pll grass[100000], ll dist){
ll pos = grass[0].first;
ll curr = 0;
for(int i = 0; i < N; i++){
if(pos > grass[M-1].second){
return false;
}
ll low = lower_bound(grass + curr, grass + M, pll(pos, 0)) - grass;
if(low > 0 && grass[low - 1].second >= pos){
low--;
}else if(grass[low].first > curr && grass[low - 1].second < pos){
pos = grass[low].first;
}
curr = low;
pos += dist;
}
return true;
}
int main(){
freopen("socdist.in", "r", stdin);
freopen("socdist.out", "w", stdout);
ll N, M;
cin >> N >> M;
pll grass[100000];
for(int i = 0; i < M; i++){
cin >> grass[i].first >> grass[i].second;
}
sort(grass, grass + M);
ll h = 1e18;
ll l = 0;
ll m = (h + l) / 2;
while(h > l + 1){
m = (h + l) / 2;
bool doeswork = works(N, M, grass, m);
if(!doeswork){
h = m - 1;
}
if(doeswork){
l = m;
}
}
while(!works(N, M, grass, m)){
m--;
}
while(works(N, M, grass, m)){
m++;
}
cout << m-1 << endl;
return 0;
}