답안 #870131

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
870131 2023-11-07T02:27:19 Z NK_ Road Construction (JOI21_road_construction) C++17
100 / 100
4267 ms 27184 KB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
 
using namespace std;
 
#define nl '\n'
#define pb push_back
#define pf push_front
 
#define mp make_pair
#define f first
#define s second
#define sz(x) int(x.size())
 
template<class T> using V = vector<T>;
using pi = pair<int, int>;
using vi = V<int>;
using vpi = V<pi>;
 
using ll = long long;
using pl = pair<ll, ll>;
using vpl = V<pl>;
using vl = V<ll>;
 
using db = long double;
using str = string;
 
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

template<class T> using pq = priority_queue<T, V<T>, greater<T>>;
template<class T> using iset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; 
 
const int MOD = 1e9 + 7;
const ll INFL = ll(1e17);
const int LG = 19;

int main() {
	cin.tie(0)->sync_with_stdio(0);

	// rotate 45 (x, y) -> (x + y, x - y)
	// Change Manhattan Distance to C. Distance (max(∆x, ∆y))

	int N, K; cin >> N >> K;
	vpl A(N); for(auto& x : A) cin >> x.f >> x.s;

	for(auto& x : A) x = mp(x.f + x.s, x.f - x.s);
	sort(begin(A), end(A));

	V<array<ll, 3>> R; 
	for(int i = 0; i < N; i++) {
		int j = i;
		while(j < N && A[i].f == A[j].f) j++;
		R.pb(array<ll, 3>{A[i].f, i, j - 1});
		i = j - 1;
	}

	int M = sz(R);

	auto dist = [&](const pl &a, const pl &b) -> ll { return max(abs(a.f - b.f), abs(a.s - b.s)); };

	iset<pl> B; vl ANS;

	auto get = [&](ll d, int t) {
		// d -> distance within
		// t -> get pairs

		B = {}; ll ans = 0; vl res;
		for(int l = 0, r = 0; r < M; r++) {
			// REM l(s)
			while(l <= r && (R[r][0] - R[l][0]) > d) {
				for(int i = R[l][1]; i <= R[l][2]; i++) B.erase(mp(A[i].s, i));
				l++;
			}

			// ADD r + COUNT PAIRS (for people in r);
			for(int i = R[r][1]; i <= R[r][2]; i++) {
				B.insert(mp(A[i].s, i));
				int li = B.order_of_key(mp(A[i].s - d, -MOD));
				int ri = B.order_of_key(mp(A[i].s + d, MOD)) - 1;

				ans += ri - li;
				if (t) for(int x = li; x <= ri; x++) {
					int j = (*B.find_by_order(x)).s;
					if (i == j) continue;

					res.pb(dist(A[i], A[j]));
				}
			}
		}	

		if (t) ANS = res;

		return ans;
	};


	ll lo = 0, hi = 5LL * MOD;
	while(lo < hi) {
		ll mid = (lo + hi) / 2;
		if (get(mid, 0) > K) hi = mid;
		else lo = mid + 1;
	}

	get(lo - 1, 1); sort(begin(ANS), end(ANS));
	while(sz(ANS) < K) ANS.pb(lo);

	for(auto& x : ANS) cout << x << nl;

	exit(0-0);
} 	 
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 5140 KB Output is correct
2 Correct 47 ms 5144 KB Output is correct
3 Correct 41 ms 5052 KB Output is correct
4 Correct 39 ms 5060 KB Output is correct
5 Correct 45 ms 4552 KB Output is correct
6 Correct 7 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1473 ms 26920 KB Output is correct
2 Correct 1493 ms 26920 KB Output is correct
3 Correct 39 ms 4952 KB Output is correct
4 Correct 1401 ms 26660 KB Output is correct
5 Correct 1485 ms 27184 KB Output is correct
6 Correct 1470 ms 26920 KB Output is correct
7 Correct 1493 ms 26148 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2648 ms 23684 KB Output is correct
2 Correct 2634 ms 23684 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 1426 ms 25892 KB Output is correct
5 Correct 2871 ms 20040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2648 ms 23684 KB Output is correct
2 Correct 2634 ms 23684 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 1426 ms 25892 KB Output is correct
5 Correct 2871 ms 20040 KB Output is correct
6 Correct 2868 ms 23688 KB Output is correct
7 Correct 2762 ms 23728 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 2700 ms 23244 KB Output is correct
11 Correct 1382 ms 25988 KB Output is correct
12 Correct 2717 ms 20044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 5140 KB Output is correct
2 Correct 47 ms 5144 KB Output is correct
3 Correct 41 ms 5052 KB Output is correct
4 Correct 39 ms 5060 KB Output is correct
5 Correct 45 ms 4552 KB Output is correct
6 Correct 7 ms 344 KB Output is correct
7 Correct 1456 ms 11536 KB Output is correct
8 Correct 1452 ms 12352 KB Output is correct
9 Correct 39 ms 5148 KB Output is correct
10 Correct 1086 ms 13800 KB Output is correct
11 Correct 822 ms 14044 KB Output is correct
12 Correct 877 ms 12364 KB Output is correct
13 Correct 1098 ms 12372 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 5140 KB Output is correct
2 Correct 47 ms 5144 KB Output is correct
3 Correct 41 ms 5052 KB Output is correct
4 Correct 39 ms 5060 KB Output is correct
5 Correct 45 ms 4552 KB Output is correct
6 Correct 7 ms 344 KB Output is correct
7 Correct 1473 ms 26920 KB Output is correct
8 Correct 1493 ms 26920 KB Output is correct
9 Correct 39 ms 4952 KB Output is correct
10 Correct 1401 ms 26660 KB Output is correct
11 Correct 1485 ms 27184 KB Output is correct
12 Correct 1470 ms 26920 KB Output is correct
13 Correct 1493 ms 26148 KB Output is correct
14 Correct 2648 ms 23684 KB Output is correct
15 Correct 2634 ms 23684 KB Output is correct
16 Correct 0 ms 344 KB Output is correct
17 Correct 1426 ms 25892 KB Output is correct
18 Correct 2871 ms 20040 KB Output is correct
19 Correct 2868 ms 23688 KB Output is correct
20 Correct 2762 ms 23728 KB Output is correct
21 Correct 1 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 2700 ms 23244 KB Output is correct
24 Correct 1382 ms 25988 KB Output is correct
25 Correct 2717 ms 20044 KB Output is correct
26 Correct 1456 ms 11536 KB Output is correct
27 Correct 1452 ms 12352 KB Output is correct
28 Correct 39 ms 5148 KB Output is correct
29 Correct 1086 ms 13800 KB Output is correct
30 Correct 822 ms 14044 KB Output is correct
31 Correct 877 ms 12364 KB Output is correct
32 Correct 1098 ms 12372 KB Output is correct
33 Correct 4267 ms 25504 KB Output is correct
34 Correct 4086 ms 25504 KB Output is correct
35 Correct 3130 ms 26304 KB Output is correct
36 Correct 2733 ms 23600 KB Output is correct
37 Correct 2691 ms 23860 KB Output is correct
38 Correct 3094 ms 20308 KB Output is correct