제출 #1157819

#제출 시각아이디문제언어결과실행 시간메모리
1157819timoniRoad Construction (JOI21_road_construction)C++17
32 / 100
10089 ms26432 KiB
// made by Tima
// 2025 will be a golden year...
//BREAK YOUR LIMITS!!!!
// #pragma GCC optimize("-funroll-loops")
// #pragma GCC optimize("-fwhole-program")
// #pragma GCC optimize("Ofast,no-stack-protector")
// #pragma GCC optimize("-fthread-jumps")
// #pragma GCC optimize("-falign-functions")
// #pragma GCC optimize("-falign-jumps")
// #pragma GCC optimize("-falign-loops")
// #pragma GCC optimize("-falign-labels")
// #pragma GCC optimize("-fcaller-saves")
// #pragma GCC optimize("-fcrossjumping")
// #pragma GCC optimize("-fcse-follow-jumps")
// #pragma GCC optimize("-fcse-skip-blocks")
// #pragma GCC optimize("-fdelete-null-pointer-checks")
// #pragma GCC optimize("-fdevirtualize")
// #pragma GCC optimize("-fexpensive-optimizations")
// #pragma GCC optimize("-fgcse")
// #pragma GCC optimize("-fgcse-lm")
// #pragma GCC optimize("-fhoist-adjacent-loads")
// #pragma GCC optimize("-finline-small-functions")
// #pragma GCC optimize("-findirect-inlining")
// #pragma GCC optimize("-fipa-sra")
// #pragma GCC optimize("-foptimize-sibling-calls")
// #pragma GCC optimize("-fpartial-inlining")
// #pragma GCC optimize("-fpeephole2")
// #pragma GCC optimize("-freorder-blocks")
// #pragma GCC optimize("-freorder-functions")
// #pragma GCC target( "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
// #pragma GCC optimize("Ofast")
// #pragma comment(linker, "/stack:200000000")
// #pragma GCC target("avx,avx2,fma")
// #pragma GCC optimization("unroll-loops")
// #pragma GCC optimize("-frerun-cse-after-loop")
// #pragma GCC optimize("-fsched-interblock")
// #pragma GCC optimize("-fsched-spec")
// #pragma GCC optimize("-fschedule-insns")
// #pragma GCC optimize("-fschedule-insns2")
// #pragma GCC optimize("-fstrict-aliasing")
// #pragma GCC optimize("-fstrict-overflow")
// #pragma GCC optimize("-ftree-switch-conversion")
// #pragma GCC optimize("-ftree-tail-merge")
// #pragma GCC optimize("-ftree-pre")
// #pragma GCC optimize("-ftree-vrp")
// #pragma GCC target("avx")
// #pragma ("reroll")

#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp>
#define ll long long
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
// #define int long long
#define y1 SBIL
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
#define pii pair<int,int>
#define tpii pair <pair <int,int> , int>
using namespace std;
using namespace __gnu_pbds;
const int N = 3e5 + 5;
int mod = 1e9 + 7;
const ll INF = 1e18;
ll a[N],b[N],d = 1e18,jpl[N],jpr[N];
int n,k;
pair <int , int> p[N];
pii nigger;
map <pii,int> mp;
ll dist(ll x1 , ll y1 , ll x2 , ll y2){
	return (ll)abs(x1 - x2) + (ll)abs(y1 - y2);
}
void solve(int l , int r){
	if(l == r) return;
	int md = l + r >> 1;
	solve(l , md) , solve(md + 1 , r);
	for(int i = md - 1 ; i >= 1 ; i--){
		if(abs(a[i] - a[md]) > d) break;
		if((ll)dist(a[i] , b[i] , a[md] , b[md]) >= d){
			i = jpl[i] + 1;
			continue;
		}
		if(!mp[{i , md}] && d > (ll)dist(a[i] , b[i] , a[md] , b[md])){
			d = (ll)dist(a[i] , b[i] , a[md] , b[md]);
			// cout << md << ' ' << i << ' ' << dist(a[i] , b[i] , a[md] , b[md]) << '\n';
			nigger = {md , i};
		}
		if(abs(a[i] - a[md]) > d) break;
	}
	for(int i = md + 1 ; i <= n ; i++){
		if(abs(a[i] - a[md]) > d) break;
		if((ll)dist(a[i] , b[i] , a[md] , b[md]) >= d){
			i = jpr[i] - 1;
			continue;
		}
		if(!mp[{md , i}] && d > (ll)dist(a[i] , b[i] , a[md] , b[md])){
			d = (ll)dist(a[i] , b[i] , a[md] , b[md]);
			// cout << md << ' ' << i << ' ' << dist(a[i] , b[i] , a[md] , b[md]) << '\n';
			nigger = {md , i};
		}
		if(abs(a[i] - a[md]) > d) break;
	}
}
void Gold(){
	cin >> n >> k;
	bool ok = 1;
	for(int i = 1 ; i <= n ; i++){
		cin >> a[i] >> b[i];
		p[i] = {a[i] , b[i]};
		if(b[i] != 0) ok = 0;
	}
	sort(p + 1 , p + n + 1);
	for(int i = 1 ; i <= n ; i++){
		a[i] = p[i].F , b[i] = p[i].S;
	}
	for(int i = 1 ; i <= n ; i++){
		int l = 1 , r = i - 1 , res = 0;
		while(l <= r){
			int md = l + r >> 1;
			if(a[md] != a[i]){
				res = md;
				l = md + 1;
			}
			else{
				r = md - 1;
			}
		}
		jpl[i] = res;
		l = i + 1 , r = n , res = n + 1;
		while(l <= r){
			int md = l + r >> 1;
			if(a[md] != a[i]){
				res = md;
				r = md - 1;
			}
			else{
				l = md + 1;
			}
		}
		jpr[i] = res;
	}
	if(n <= 1000){
		multiset <ll> q;
		for(int i = 1 ; i <= n ; i++){
			for(int j = i + 1 ; j <= n ; j++){
				// cout << abs(a[i] - a[j]) + abs(b[i] - b[j]) << ' ' << i << ' ' << j << '\n';
				q.insert(abs(a[i] - a[j]) + abs(b[i] - b[j]));
			}
		}
		int cnt = 0;
		for(auto it : q){
			cout << it << '\n';
			cnt++;
			if(cnt == k){
				break;
			}
		}
		return;
	}
	//2 4
	//4 5
	if(k == 1){
		solve(1 , n);
		cout << d << '\n';	
		return;
	}	
	while(k--){
		d = 1e18;
		solve(1 , n);
		cout << d << '\n';
		// cout << nigger.F << ' ' << nigger.S << '\n';
		if(k) mp[{min(nigger.F , nigger.S) , max(nigger.F , nigger.S)}] = 1;
	}
}
signed main(/*Zhunussov Temirlan*/){
	//freopen("txt.in","r",stdin);freopen("txt.out","w",stdout);
	ios_base::sync_with_stdio(0);cin.tie(0);
	srand(time(0));
	int TT = 1;
	// cin >> TT;
	for(int i = 1 ; i <= TT ; i++){
		//cout << "Case " << i << ": ";
		Gold();
	}
}
#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...