Submission #415849

#TimeUsernameProblemLanguageResultExecution timeMemory
415849koioi.org-koosagaRoad Construction (JOI21_road_construction)C++17
100 / 100
2919 ms16280 KiB
#include <bits/stdc++.h>
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
using namespace std;
using lint = long long;
using pi = pair<lint, lint>;
const int MAXN = 250005;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

struct bit{
	int tree[MAXN];
	void add(int x, int v){
		for(int i = x + 1; i < MAXN; i += i & -i) tree[i] += v;
	}
	int query(int x){
		int ret = 0;
		for(int i = x + 1; i; i -= i & -i) ret += tree[i];
		return ret;
	}
	void clear(){
		memset(tree, 0, sizeof(tree));
	}
}bit;

int n, k;
pi a[MAXN];
vector<lint> v;

bool trial(lint m){
	int j = 0;
	int ret = 0;
	bit.clear();
	for(int i = 0; i < n; i++){
		while(a[i].first - a[j].first > m){
			bit.add(a[j++].second, -1);
		}
		int l = lower_bound(all(v), v[a[i].second] - m) - v.begin();
		int r = upper_bound(all(v), v[a[i].second] + m) - v.begin();
		ret += bit.query(r - 1) - bit.query(l - 1);
		if(ret > k) return 0;
		bit.add(a[i].second, +1);
	}
	return 1;
}

void report(lint m){
	vector<lint> ans;
	int j = 0;
	set<pi> s;
	for(int i = 0; i < n; i++){
		while(a[i].first - a[j].first > m){
			s.erase(pi(v[a[j].second], j));
			j++;
		}
		auto it = s.lower_bound(pi(v[a[i].second] - m, -1));
		while(it != s.end() && it->first <= v[a[i].second] + m){
			int j = it->second;
			lint dist = max(abs(a[i].first - a[j].first), abs(v[a[i].second] - v[a[j].second]));
			ans.push_back(dist);
			it++;
		}
		s.insert(pi(v[a[i].second], i));
	}
	sort(all(ans));
	while(sz(ans) < k) ans.push_back(m + 1);
	for(auto &i : ans) printf("%lld\n", i);
}

int main(){
	scanf("%d %d",&n,&k);
	for(int i = 0; i < n; i++){
		int x, y;
		scanf("%d %d",&x,&y);
		a[i] = pi(x-y, x+y);
		v.push_back(x+y);
	}
	sort(a, a + n);
	sort(all(v));
	v.resize(unique(all(v)) - v.begin());
	for(int i = 0; i < n; i++){
		a[i].second = lower_bound(all(v), a[i].second) - v.begin();
	}
	lint s = 0, e = 4e9;
	while(s != e){
		lint m = (s+e+1)/2;
		if(trial(m)) s = m;
		else e = m - 1;
	}
	report(s);
}

Compilation message (stderr)

road_construction.cpp: In function 'int main()':
road_construction.cpp:71:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |  scanf("%d %d",&n,&k);
      |  ~~~~~^~~~~~~~~~~~~~~
road_construction.cpp:74:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |   scanf("%d %d",&x,&y);
      |   ~~~~~^~~~~~~~~~~~~~~
#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...