Submission #543118

# Submission time Handle Problem Language Result Execution time Memory
543118 2022-03-29T11:38:08 Z square1001 Road Construction (JOI21_road_construction) C++14
100 / 100
251 ms 27724 KB
#include <set>
#include <cmath>
#include <cstdio>
#include <cstdint>
#include <algorithm>
using namespace std;

uint64_t seed = 123456789;
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[524288], restmp[524288];

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 = 3000000;
	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;
}
# Verdict Execution time Memory Grader output
1 Correct 226 ms 16828 KB Output is correct
2 Correct 227 ms 16928 KB Output is correct
3 Correct 25 ms 5196 KB Output is correct
4 Correct 26 ms 5160 KB Output is correct
5 Correct 211 ms 15816 KB Output is correct
6 Correct 123 ms 12276 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 176 ms 21912 KB Output is correct
2 Correct 176 ms 25000 KB Output is correct
3 Correct 23 ms 5084 KB Output is correct
4 Correct 183 ms 25296 KB Output is correct
5 Correct 163 ms 24248 KB Output is correct
6 Correct 165 ms 24364 KB Output is correct
7 Correct 166 ms 24392 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 187 ms 18220 KB Output is correct
2 Correct 203 ms 23308 KB Output is correct
3 Correct 1 ms 596 KB Output is correct
4 Correct 152 ms 21204 KB Output is correct
5 Correct 218 ms 23420 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 187 ms 18220 KB Output is correct
2 Correct 203 ms 23308 KB Output is correct
3 Correct 1 ms 596 KB Output is correct
4 Correct 152 ms 21204 KB Output is correct
5 Correct 218 ms 23420 KB Output is correct
6 Correct 209 ms 23244 KB Output is correct
7 Correct 186 ms 23260 KB Output is correct
8 Correct 1 ms 552 KB Output is correct
9 Correct 1 ms 596 KB Output is correct
10 Correct 211 ms 23216 KB Output is correct
11 Correct 137 ms 21036 KB Output is correct
12 Correct 205 ms 23512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 226 ms 16828 KB Output is correct
2 Correct 227 ms 16928 KB Output is correct
3 Correct 25 ms 5196 KB Output is correct
4 Correct 26 ms 5160 KB Output is correct
5 Correct 211 ms 15816 KB Output is correct
6 Correct 123 ms 12276 KB Output is correct
7 Correct 192 ms 20832 KB Output is correct
8 Correct 173 ms 20580 KB Output is correct
9 Correct 25 ms 5204 KB Output is correct
10 Correct 155 ms 20148 KB Output is correct
11 Correct 146 ms 20020 KB Output is correct
12 Correct 158 ms 18644 KB Output is correct
13 Correct 165 ms 19244 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 226 ms 16828 KB Output is correct
2 Correct 227 ms 16928 KB Output is correct
3 Correct 25 ms 5196 KB Output is correct
4 Correct 26 ms 5160 KB Output is correct
5 Correct 211 ms 15816 KB Output is correct
6 Correct 123 ms 12276 KB Output is correct
7 Correct 176 ms 21912 KB Output is correct
8 Correct 176 ms 25000 KB Output is correct
9 Correct 23 ms 5084 KB Output is correct
10 Correct 183 ms 25296 KB Output is correct
11 Correct 163 ms 24248 KB Output is correct
12 Correct 165 ms 24364 KB Output is correct
13 Correct 166 ms 24392 KB Output is correct
14 Correct 187 ms 18220 KB Output is correct
15 Correct 203 ms 23308 KB Output is correct
16 Correct 1 ms 596 KB Output is correct
17 Correct 152 ms 21204 KB Output is correct
18 Correct 218 ms 23420 KB Output is correct
19 Correct 209 ms 23244 KB Output is correct
20 Correct 186 ms 23260 KB Output is correct
21 Correct 1 ms 552 KB Output is correct
22 Correct 1 ms 596 KB Output is correct
23 Correct 211 ms 23216 KB Output is correct
24 Correct 137 ms 21036 KB Output is correct
25 Correct 205 ms 23512 KB Output is correct
26 Correct 192 ms 20832 KB Output is correct
27 Correct 173 ms 20580 KB Output is correct
28 Correct 25 ms 5204 KB Output is correct
29 Correct 155 ms 20148 KB Output is correct
30 Correct 146 ms 20020 KB Output is correct
31 Correct 158 ms 18644 KB Output is correct
32 Correct 165 ms 19244 KB Output is correct
33 Correct 251 ms 27724 KB Output is correct
34 Correct 240 ms 27452 KB Output is correct
35 Correct 246 ms 27196 KB Output is correct
36 Correct 222 ms 25280 KB Output is correct
37 Correct 230 ms 25192 KB Output is correct
38 Correct 227 ms 27276 KB Output is correct