#include <set>
#include <cmath>
#include <cstdio>
#include <cstdint>
#include <algorithm>
using namespace std;
uint64_t seed = 987654321;
uint64_t xorshift64() {
seed ^= seed << 13;
seed ^= seed >> 17;
seed ^= seed << 7;
return seed;
}
int rand_int(int l, int r) {
return l + int(xorshift64() % (r - l));
}
int inv_binomial(int N, double p, double alpha) {
// least N such that P(x <= N) >= alpha
const double log_p1 = log(p);
const double log_p2 = log(1.0 - p);
double sum = 0.0;
double logval = log_p2 * N;
for (int i = 0; i < N; i++) {
sum += exp(logval);
if (sum >= alpha) {
return i;
}
logval += log_p1 - log_p2 + log(double(N - i) / (i + 1));
}
return N;
}
int X[262144], Y[262144], A[262144], B[262144], perm[262144], permtmp[262144], cnt[66560];
unsigned dist[3014656], res[786432], restmp[786432];
int readint() {
char ch = getchar_unlocked();
bool minus = false;
if (ch == '-') {
minus = true;
ch = getchar_unlocked();
}
int res = 0;
while ('0' <= ch && ch <= '9') {
res = res * 10 + int(ch - '0');
ch = getchar_unlocked();
}
return (minus ? -res : res);
}
char buf[64];
void writeint(unsigned x) {
int pos = 0;
while (x > 0) {
buf[pos++] = x % 10 + '0';
x /= 10;
}
while (pos--) {
putchar_unlocked(buf[pos]);
}
putchar_unlocked('\n');
}
int main() {
// step #1. read input
int N = readint();
int K = readint();
for (int i = 0; i < N; i++) {
X[i] = readint();
Y[i] = readint();
}
// step #2. random sampling setup
const double p = double(K) / (1LL * N * (N - 1) / 2);
const int samples = 2000000;
const int rank = (p != 1.0 ? inv_binomial(samples, p, 0.95) : samples);
// step #3. random sampling
long long border;
if (rank == samples) {
border = (1LL << 32);
}
else {
for (int i = 0; i < samples; i++) {
int va = rand_int(0, N);
int vb = (va + rand_int(1, N)) % N;
dist[i] = abs(X[va] - X[vb]) + abs(Y[va] - Y[vb]);
}
nth_element(dist, dist + rank, dist + samples);
border = dist[rank] - 1;
}
// step #4. rotate 45 degrees
for (int i = 0; i < N; i++) {
A[i] = X[i] + Y[i];
B[i] = X[i] - Y[i];
}
// step #5. sort by A[i]
for (int i = 0; i < N; i++) cnt[(A[i] & 65535) + 1]++;
for (int i = 0; i < 65536; i++) cnt[i + 1] += cnt[i];
for (int i = 0; i < N; i++) permtmp[cnt[A[i] & 65535]++] = i;
for (int i = 0; i < 65537; i++) cnt[i] = 0;
for (int i = 0; i < N; i++) cnt[(A[i] >> 16) + 32769]++;
for (int i = 0; i < 65536; i++) cnt[i + 1] += cnt[i];
for (int i = 0; i < N; i++) perm[cnt[(A[permtmp[i]] >> 16) + 32768]++] = permtmp[i];
// step #6. sweepline algorithm
int C = 0, pl = 0;
set<pair<int, int> > s;
for (int i = 0; i < N; i++) {
int u = perm[i];
int BL = max(B[u] - border, -2000000000LL);
int BR = min(B[u] + border, +2000000000LL);
while (A[u] - A[perm[pl]] > border) {
s.erase(make_pair(B[perm[pl]], perm[pl]));
pl++;
}
set<pair<int, int> >::iterator it = s.lower_bound(make_pair(BL, -1));
while (it != s.end() && it->first <= BR) {
res[C++] = abs(X[it->second] - X[u]) + abs(Y[it->second] - Y[u]);
it++;
}
s.insert(make_pair(B[u], u));
}
// step #7. sort the distance
for (int i = 0; i < 65537; i++) cnt[i] = 0;
for (int i = 0; i < C; i++) cnt[(res[i] & 65535) + 1]++;
for (int i = 0; i < 65536; i++) cnt[i + 1] += cnt[i];
for (int i = 0; i < C; i++) restmp[cnt[res[i] & 65535]++] = res[i];
for (int i = 0; i < 65537; i++) cnt[i] = 0;
for (int i = 0; i < C; i++) cnt[(res[i] >> 16) + 1U]++;
for (int i = 0; i < 65536; i++) cnt[i + 1] += cnt[i];
for (int i = 0; i < C; i++) res[cnt[restmp[i] >> 16]++] = restmp[i];
// step #8. final answer
for (int i = 0; i < K; i++) {
writeint(i < C ? res[i] : border + 1);
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
162 ms |
12972 KB |
Output is correct |
2 |
Correct |
158 ms |
12976 KB |
Output is correct |
3 |
Correct |
25 ms |
5196 KB |
Output is correct |
4 |
Correct |
25 ms |
5156 KB |
Output is correct |
5 |
Correct |
149 ms |
11948 KB |
Output is correct |
6 |
Correct |
71 ms |
8372 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
137 ms |
19460 KB |
Output is correct |
2 |
Correct |
135 ms |
18212 KB |
Output is correct |
3 |
Correct |
23 ms |
5068 KB |
Output is correct |
4 |
Correct |
133 ms |
17976 KB |
Output is correct |
5 |
Correct |
117 ms |
17376 KB |
Output is correct |
6 |
Correct |
123 ms |
17364 KB |
Output is correct |
7 |
Correct |
116 ms |
17284 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
171 ms |
14280 KB |
Output is correct |
2 |
Correct |
179 ms |
14516 KB |
Output is correct |
3 |
Correct |
1 ms |
596 KB |
Output is correct |
4 |
Correct |
111 ms |
14272 KB |
Output is correct |
5 |
Correct |
173 ms |
14172 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
171 ms |
14280 KB |
Output is correct |
2 |
Correct |
179 ms |
14516 KB |
Output is correct |
3 |
Correct |
1 ms |
596 KB |
Output is correct |
4 |
Correct |
111 ms |
14272 KB |
Output is correct |
5 |
Correct |
173 ms |
14172 KB |
Output is correct |
6 |
Correct |
161 ms |
14284 KB |
Output is correct |
7 |
Correct |
168 ms |
14280 KB |
Output is correct |
8 |
Correct |
1 ms |
596 KB |
Output is correct |
9 |
Correct |
1 ms |
596 KB |
Output is correct |
10 |
Correct |
169 ms |
14308 KB |
Output is correct |
11 |
Correct |
108 ms |
14160 KB |
Output is correct |
12 |
Correct |
164 ms |
14256 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
162 ms |
12972 KB |
Output is correct |
2 |
Correct |
158 ms |
12976 KB |
Output is correct |
3 |
Correct |
25 ms |
5196 KB |
Output is correct |
4 |
Correct |
25 ms |
5156 KB |
Output is correct |
5 |
Correct |
149 ms |
11948 KB |
Output is correct |
6 |
Correct |
71 ms |
8372 KB |
Output is correct |
7 |
Correct |
136 ms |
14688 KB |
Output is correct |
8 |
Correct |
130 ms |
15428 KB |
Output is correct |
9 |
Correct |
25 ms |
5196 KB |
Output is correct |
10 |
Correct |
126 ms |
14496 KB |
Output is correct |
11 |
Correct |
112 ms |
13960 KB |
Output is correct |
12 |
Correct |
127 ms |
12664 KB |
Output is correct |
13 |
Correct |
135 ms |
13420 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
162 ms |
12972 KB |
Output is correct |
2 |
Correct |
158 ms |
12976 KB |
Output is correct |
3 |
Correct |
25 ms |
5196 KB |
Output is correct |
4 |
Correct |
25 ms |
5156 KB |
Output is correct |
5 |
Correct |
149 ms |
11948 KB |
Output is correct |
6 |
Correct |
71 ms |
8372 KB |
Output is correct |
7 |
Correct |
137 ms |
19460 KB |
Output is correct |
8 |
Correct |
135 ms |
18212 KB |
Output is correct |
9 |
Correct |
23 ms |
5068 KB |
Output is correct |
10 |
Correct |
133 ms |
17976 KB |
Output is correct |
11 |
Correct |
117 ms |
17376 KB |
Output is correct |
12 |
Correct |
123 ms |
17364 KB |
Output is correct |
13 |
Correct |
116 ms |
17284 KB |
Output is correct |
14 |
Correct |
171 ms |
14280 KB |
Output is correct |
15 |
Correct |
179 ms |
14516 KB |
Output is correct |
16 |
Correct |
1 ms |
596 KB |
Output is correct |
17 |
Correct |
111 ms |
14272 KB |
Output is correct |
18 |
Correct |
173 ms |
14172 KB |
Output is correct |
19 |
Correct |
161 ms |
14284 KB |
Output is correct |
20 |
Correct |
168 ms |
14280 KB |
Output is correct |
21 |
Correct |
1 ms |
596 KB |
Output is correct |
22 |
Correct |
1 ms |
596 KB |
Output is correct |
23 |
Correct |
169 ms |
14308 KB |
Output is correct |
24 |
Correct |
108 ms |
14160 KB |
Output is correct |
25 |
Correct |
164 ms |
14256 KB |
Output is correct |
26 |
Correct |
136 ms |
14688 KB |
Output is correct |
27 |
Correct |
130 ms |
15428 KB |
Output is correct |
28 |
Correct |
25 ms |
5196 KB |
Output is correct |
29 |
Correct |
126 ms |
14496 KB |
Output is correct |
30 |
Correct |
112 ms |
13960 KB |
Output is correct |
31 |
Correct |
127 ms |
12664 KB |
Output is correct |
32 |
Correct |
135 ms |
13420 KB |
Output is correct |
33 |
Correct |
213 ms |
18380 KB |
Output is correct |
34 |
Correct |
216 ms |
20664 KB |
Output is correct |
35 |
Correct |
187 ms |
17888 KB |
Output is correct |
36 |
Correct |
172 ms |
16096 KB |
Output is correct |
37 |
Correct |
174 ms |
16384 KB |
Output is correct |
38 |
Correct |
184 ms |
16852 KB |
Output is correct |