Submission #1157912

#TimeUsernameProblemLanguageResultExecution timeMemory
1157912shnRoad Construction (JOI21_road_construction)C++20
0 / 100
10090 ms152568 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast,O3,unroll-loops")
#pragma GCC target("avx,avx2")
#define Respaabs1equal2xdoner cin.tie(nullptr)->sync_with_stdio(false);
#define pll pair < long long , long long >
#define len(s) (long long)(s.size())
#define all(x) x.begin() , x.end()
#define pofik continue
#define int long long
#define pb push_back
#define F first
#define S second
const int N = 9e5 + 77 , inf = 1e18 + 77;

int n , k;

int x[N][5] , y[N][5];

void rotate(int &a , int &b){
	int c = a;
	a = a - b;
	b = c + b;
}

int t[N * 4];

void upd(int v , int l , int r , int pos , int x){
	// if(l == r){
		// t[v] += x;
		// return;
	// }
	// int mid = (l + r) >> 1;
	// if(pos <= mid) upd(v * 2 , l , mid , pos , x);
	// else upd(v * 2 + 1 , mid + 1 , r , pos , x);
	// t[v] = t[v * 2] + t[v * 2 + 1];
	
	while(pos <= r){
		
		t[pos] += x;
		
		pos += pos & -pos;
		
	}
	
}

int get(int v , int l , int r , int ql , int qr){
	// if(ql <= l && r <= qr) return t[v];
	// if(ql > r || qr < l) return 0;
	// int mid = (l + r) >> 1;
	// return get(v * 2 , l , mid , ql , qr) + get(v * 2 + 1 , mid + 1 , r , ql , qr);
	
	int ans = 0;
	
	while(qr){
		
		ans += t[qr];
		
		qr -= qr & -qr;
		
	}
	
	ql--;
	
	while(ql){
		
		ans -= t[ql];
		
		ql -= ql & -ql;
		
	}
	
	return ans;
	
}

bool check(int d){
	int ans = 0;
	vector < pair < int , pair < int , pll > > > g;
	set < int > st;
	for(int i = 1; i <= n; i++){
		int a = x[i][0] , b = y[i][0];
		x[i][1] = a , y[i][1] = b + d;
		x[i][2] = a + d , y[i][2] = b;
		x[i][3] = a , y[i][3] = b - d;
		x[i][4] = a - d , y[i][4] = b;
		for(int j = 1; j <= 4; j++){
			rotate(x[i][j] , y[i][j]);
		}
		rotate(a , b);
		st.insert(a);
		st.insert(x[i][1]);
		st.insert(x[i][2]);
	}
	int o = 0;
	unordered_map < int , int > mp;
	for(int it : st) mp[it] = ++o;
	for(int i = 1; i <= n; i++){
		int a = x[i][0] , b = y[i][0];
		rotate(a , b);
		g.pb({b , {1 , {mp[a], mp[a]}}});
		g.pb({y[i][1] , {3 , {mp[a], mp[a]}}});
		g.pb({b , {2 , {mp[x[i][1]] , mp[x[i][2]]}}});
	}
	sort(all(g));
	for(auto it : g){
		int y2 = it.F;
		int type = it.S.F;
		int l = it.S.S.F , r = it.S.S.S;
		if(type == 1) upd(1 , 1 , 3 * n , l , 1);
		else if(type == 3) upd(1 , 1 , 3 * n , l , -1);
		else ans += get(1 , 1 , 3 * n , l , r) - 1;
	}
	return (ans < k);
}

void solve(){
	cin >> n >> k;
	for(int i = 1; i <= n; i++){
		cin >> x[i][0] >> y[i][0];
	}
	int l = 1 , r = 4e9 , res = 1;
	// check(4);
	while(l <= r){
		int mid = (l + r) >> 1ll;
		if(check(mid)){
			l = mid + 1;
		}
		else{
			res = mid;
			r = mid - 1;
		}
	}
	cout << res << '\n';
	// make(res);
}

signed main(){
	Respaabs1equal2xdoner
	int T = 1;
	// cin >> T;
	while(T--){
		solve();
	}
}
#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...