#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 250005, INF = 5e9 + 10;
int n, k;
pair<int, int> a[maxn];
int ysz;
vector<int> xvals = {-INF}, yvals = {-INF};
int ldc(int x) {return lower_bound(yvals.begin(), yvals.end(), x) - yvals.begin();}
int rdc(int x) {return upper_bound(yvals.begin(), yvals.end(), x) - yvals.begin() - 1;}
int fen[maxn];
void update(int id) {
while (id <= ysz) {
fen[id]++;
id += (id & -id);
}
}
int qry(int id) {
int val = 0;
while (id >= 1) {
val += fen[id];
id -= (id & -id);
}
return val;
}
int cunt(int dist) {
int ans = 0, pt = 0;
for (int i=1;i<=n;i++) {
while (pt+1 <= n && a[pt+1].first <= a[i].first + dist) {
pt++;
int L = ldc(a[pt].second - dist), R = rdc(a[pt].second + dist);
ans -= qry(R) - qry(L-1);
// cout << "- " << (a[pt].first+a[pt].second)/2 << " " << (a[pt].first-a[pt].second)/2 << " " << qry(R) - qry(L-1) << endl;
}
int L = ldc(a[i].second - dist), R = rdc(a[i].second + dist);
ans += qry(R) - qry(L-1);
// cout << "+ " << (a[i].first+a[i].second)/2 << " " << (a[i].first-a[i].second)/2 << " " << qry(R) - qry(L-1) << endl;
int pos = ldc(a[i].second);
update(pos);
}
return ans;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> k;
for (int i=1;i<=n;i++) {
int x, y;
cin >> x >> y;
a[i] = {x+y, x-y};
xvals.push_back(x+y);
yvals.push_back(x-y);
}
sort(a+1, a+n+1);
sort(xvals.begin(), xvals.end());
xvals.erase(unique(xvals.begin(), xvals.end()), xvals.end());
sort(yvals.begin(), yvals.end());
yvals.erase(unique(yvals.begin(), yvals.end()), yvals.end());
ysz = yvals.size() - 1;
int L = 1, R = INF;
while (L < R) {
int mid = (L+R)/2;
if (cunt(mid) < k) L = mid+1;
else R = mid;
}
int dist = L - 1;
vector<int> ans;
multiset<pair<int,int>> s;
s.insert({INF, INF});
int l = 0, r = 0;
int cnt = 0;
for (int i=1;i<=n;i++) {
while (r+1 <= n && a[r+1].first <= a[i].first + dist) {
r++;
s.insert({a[r].second, a[r].first});
}
while (l+1 <= n && a[l+1].first < a[i].first - dist) {
l++;
s.erase({a[l].second, a[l].first});
}
// cout << "test\n";
// cout << (a[i].first+a[i].second)/2 << " " << (a[i].first-a[i].second)/2 << endl;
auto it = s.lower_bound({a[i].second - dist, -INF});
while ((it->first) <= a[i].second + dist) {
pair<int,int> cur = *it;
if (a[i].first!=cur.second || a[i].second!=cur.first) {
ans.push_back(max(abs(a[i].first - cur.second), abs(a[i].second - cur.first)));
// assert(max(abs(a[i].first - cur.second), abs(a[i].second - cur.first)) <= dist);
cnt++;
// cout << max(abs(a[i].first - cur.second), abs(a[i].second - cur.first)) << endl;
}
it++;
}
}
while (ans.size() < 2*k) ans.push_back(L);
sort(ans.begin(), ans.end());
for (int i=0;i<2*k;i+=2) cout << ans[i] << '\n';
}
Compilation message
road_construction.cpp: In function 'int main()':
road_construction.cpp:101:23: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
101 | while (ans.size() < 2*k) ans.push_back(L);
| ~~~~~~~~~~~^~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
65 ms |
9160 KB |
Output is correct |
2 |
Correct |
61 ms |
9280 KB |
Output is correct |
3 |
Runtime error |
2307 ms |
2097152 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1812 ms |
16664 KB |
Output is correct |
2 |
Correct |
1841 ms |
15628 KB |
Output is correct |
3 |
Correct |
51 ms |
9136 KB |
Output is correct |
4 |
Correct |
1830 ms |
16660 KB |
Output is correct |
5 |
Correct |
1935 ms |
16664 KB |
Output is correct |
6 |
Correct |
1979 ms |
16808 KB |
Output is correct |
7 |
Correct |
1643 ms |
16668 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4514 ms |
10484 KB |
Output is correct |
2 |
Correct |
4573 ms |
10548 KB |
Output is correct |
3 |
Runtime error |
1795 ms |
2097152 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4514 ms |
10484 KB |
Output is correct |
2 |
Correct |
4573 ms |
10548 KB |
Output is correct |
3 |
Runtime error |
1795 ms |
2097152 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
65 ms |
9160 KB |
Output is correct |
2 |
Correct |
61 ms |
9280 KB |
Output is correct |
3 |
Runtime error |
2307 ms |
2097152 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
65 ms |
9160 KB |
Output is correct |
2 |
Correct |
61 ms |
9280 KB |
Output is correct |
3 |
Runtime error |
2307 ms |
2097152 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |