Submission #394012

#TimeUsernameProblemLanguageResultExecution timeMemory
394012oolimryRoad Construction (JOI21_road_construction)C++17
100 / 100
2176 ms15288 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int) x.size())
#define show(x) cerr << #x << " is " << x << endl;
#define show2(x, y) cerr << #x << " is " << x << ", " << #y << " is " << y << endl;
#define x first
#define y second
typedef long long lint;
typedef pair<lint, lint> ii;

int n, K;
vector<ii> points;
vector<lint> ans;
set<ii> S;

inline lint get(int a, int b){
	return max(abs(points[a].x - points[b].x), abs(points[a].y - points[b].y));
}
void solve(lint dis){
	ans.clear();
	S.clear();
	int ptr = 0;
	for(int i = 0;i < n;i++){
		ii p = points[i];
		
		while(true){
			if(p.x - points[ptr].x <= dis) break;
			else{
				S.erase(ii(points[ptr].y, ptr));
				ptr++;
			}
		}
		
		auto it = S.lower_bound({p.y - dis, -1});
		while(it != S.end()){
			if(it->first > p.y + dis) break;
			ans.push_back(get(it->second, i));
			if(sz(ans) >= K) return;
			it++;
		} 
		
		S.insert(ii(p.y, i));
	}
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	
	cin >> n >> K;
	for(int i = 1;i <= n;i++){
		lint x, y; cin >> x >> y;
		points.push_back(ii(x+y,x-y));
	}
	sort(all(points));
	
	lint low = 0; lint high = 4e9;
	while(low != high-1){
		lint mid = (low+high)/2;
		solve(mid);
		if(sz(ans) >= K) high = mid;
		else low = mid;
	}
	
	solve(low);
	sort(all(ans));
	while(sz(ans) < K) ans.push_back(high);
	for(lint x : ans) cout << x << "\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...