Submission #439642

#TimeUsernameProblemLanguageResultExecution timeMemory
439642ics0503Road Construction (JOI21_road_construction)C++17
65 / 100
10079 ms28628 KiB
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
struct xy { long long x, y, idx; }a[262626];
bool sort_x(xy a, xy b) {
	if (a.x != b.x)return a.x < b.x;
	return a.y < b.y;
}
bool sort_y(xy a, xy b) {
	if (a.y != b.y)return a.y > b.y;
	return a.x > b.x;
}
long long T[2][1212121], TW[2][1212121], tn;
void insert_g(long long type, long long w, long long g) {
	T[type][tn + w] = g;
	TW[type][tn + w] = tn+w;
	for (long long i = (w + tn) / 2; i > 0; i /= 2) {
		T[type][i] = min(T[type][i * 2], T[type][i * 2 + 1]);
		TW[type][i] = T[type][i * 2] <= T[type][i * 2 + 1] ? TW[type][i * 2] : TW[type][i * 2 + 1];
	}
}
long long n, k, mxv = 1e18;
pair<long long, long long>search_g(long long type, long long s, long long e) {
	s += tn; e += tn;
	pair<long long, long long>res;
	res.first = mxv;
	while (s <= e) {
		if (s % 2 == 1) {
			if (res.first > T[type][s])res = { T[type][s],TW[type][s] };
			s++;
		}
		if (e % 2 == 0) {
			if (res.first > T[type][e])res = { T[type][e],TW[type][e] };
			e--;
		}
		s /= 2; e /= 2;
	}
	return res;
}
vector<long long>dd;
long long f(long long x, long long flag) {
	long long i, j, pc;
	vector<pair<long long, long long>>L, R;
	for (i = 0; i < tn * 2; i++)T[0][i] = T[1][i] = mxv;
	pc = 0; long long ans = 0;
	for (i = 0; i < n; i++) {
		while (pc < k) {
			auto sr = search_g(0, a[i].idx, n);
			long long v = sr.first, who = sr.second - tn;
			if (v == mxv)break;
			long long res = v - a[i].x - a[i].y;
			if (res > x)break;
			if (flag) dd.push_back(res);
			L.push_back({ v,who }); insert_g(0, who, mxv);
			ans += res; pc++;
		}
		while (pc < k) {
			auto sr = search_g(1, 0, a[i].idx);
			long long v = sr.first, who = sr.second - tn;
			if (v == mxv)break;
			long long res = v + a[i].x - a[i].y;
			if (res > x)break;
			if (flag) dd.push_back(res);
			R.push_back({ v,who }); insert_g(1, who, mxv);
			ans += res; pc++;
		}
		for (auto v : L)insert_g(0, v.second, v.first);
		for (auto v : R)insert_g(1, v.second, v.first);
		L.clear(); R.clear();
		insert_g(0, a[i].idx, a[i].x + a[i].y);
		insert_g(1, a[i].idx, -a[i].x + a[i].y);
	}
	if (pc < k)return -1;
	return ans;
}

int main() {
	scanf("%lld%lld", &n, &k);
	for (tn = 1; tn <= n; tn *= 2);
	long long i, j;
	for (i = 0; i < n; i++)scanf("%lld%lld", &a[i].x, &a[i].y);
	sort(a, a + n, sort_x);
	for (i = 0; i < n; i++)a[i].idx = i;
	sort(a, a + n, sort_y);
	long long s = 1, e = 1e10, ans = 0;
	while (s <= e) {
		long long m = (s + e) / 2;
		long long R = f(m, 0);
		if (R == -1) {
			s = m + 1;
		}
		else {
			e = m - 1;
			ans = m;
		}
	}
	f(ans - 1, 1);
	sort(dd.begin(), dd.end());
	for (auto v : dd)printf("%lld\n", v);
	for (i = dd.size(); i < k; i++)printf("%lld\n", ans);
	return 0;
}

Compilation message (stderr)

road_construction.cpp: In function 'long long int f(long long int, long long int)':
road_construction.cpp:43:15: warning: unused variable 'j' [-Wunused-variable]
   43 |  long long i, j, pc;
      |               ^
road_construction.cpp: In function 'int main()':
road_construction.cpp:81:15: warning: unused variable 'j' [-Wunused-variable]
   81 |  long long i, j;
      |               ^
road_construction.cpp:79:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |  scanf("%lld%lld", &n, &k);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~
road_construction.cpp:82:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |  for (i = 0; i < n; i++)scanf("%lld%lld", &a[i].x, &a[i].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...