Submission #503990

#TimeUsernameProblemLanguageResultExecution timeMemory
503990sidonRoad Construction (JOI21_road_construction)C++17
12 / 100
5257 ms79776 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define C(Z) lower_bound(xVals, xVals + N, Z) - xVals
#define calc(i, j) max(abs(X[i] - X[j]), abs(Y[i] - Y[j]))
#define int int64_t

const int LIM = 250'000;

int N, K, ext;
int X[LIM], Y[LIM], byY[LIM], xVals[LIM], xPos[LIM];
map<int, int> done[LIM];

bool build(int dist, bool final) {
	set<array<int, 2>> on;
	for(int i = 0; i < N; ++i)
		done[i].clear();

	int p = 0, f = 0;
 
 	for(int _ = 0; _ < N; ++_) {
 		int i = byY[_];
		while(Y[i] - Y[byY[p]] > dist)
			on.erase({X[byY[p]], byY[p]}), ++p;
 
		auto j = on.lower_bound({(X[i] - dist), -1});
		bool nxt = 1;
 
		while(j != end(on) && (*j)[0] <= X[i] + dist) {
			f += (++done[(*j)[1]][i] < 2);
			if(final && calc(i, (*j)[1]) == dist && !--ext) {
				--dist;
 
				while(Y[i] - Y[byY[p]] > dist)
					on.erase({X[byY[p]], byY[p]}), ++p;
 
				j = on.lower_bound({(X[i] - dist), -1});
				nxt = 0;
			}
			if(!final && f >= K) return 0;
			if(nxt) ++j;
			nxt = 1;
		}
 
		on.insert({X[i], i});
	}
	return f + 1;
}

 
int32_t main() {
	ios::sync_with_stdio(0), cin.tie(0);
 
	cin >> N >> K;
 
	for(int i = 0, x, y; i < N; ++i) {
		cin >> x >> y;
		X[i] = x + y;
		Y[i] = x - y;
		byY[i] = i;
		xVals[i] = X[i];
	}

	sort(byY, byY + N, [&](int &i, int &j) {
		return Y[i] < Y[j];
	});
	sort(xVals, xVals + N);
 
	for(int i = 0; i < N; ++i)
		xPos[i] = C(X[i]);
 
	int dist = -1;

	for(int b = 1LL<<33, c; b /= 2; ) {
		if((c = build(dist + b, 0))) dist += b, ext = K - (c - 1);
	}
	++dist;
	build(dist, 1);

	int res[K], p = 0;	
	for(int i = 0; i < N; ++i)
		for(auto [j, _] : done[i])
			res[p++] = calc(i, j);

	sort(res, res + K);
	for(int i : res) cout << i << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...