Submission #787393

# Submission time Handle Problem Language Result Execution time Memory
787393 2023-07-19T06:46:16 Z 박영우(#10035) 도로 건설 사업 (JOI13_construction) C++17
0 / 100
243 ms 10532 KB
#include <bits/stdc++.h>
#include <cassert>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,fma")
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
#define MAX 1001010
#define MAXS 20
#define INF 1000000000000000001
#define bb ' '
#define ln '\n'
#define Ln '\n'
vector<pair<int, pii>> hst, vst;
pii edges[MAX];
int W[MAX];
pii point[MAX];
int p[MAX];
int find(int a) {
	if (p[a] == a) return a;
	return p[a] = find(p[a]);
}
bool uni(int a, int b) {
	a = find(a);
	b = find(b);
	if (a == b) return false;
	p[a] = b;
	return true;
}
int cv[MAX];
ll psum[MAX];
signed main() {
	ios::sync_with_stdio(false), cin.tie(0);
	int N, M, C;
	cin >> N >> M >> C;
	int i, a, b, c, d;
	for (i = 1; i <= N; i++) cin >> point[i].first >> point[i].second;
	for (i = 1; i <= M; i++) {
		cin >> a >> b >> c >> d;
		hst.emplace_back(b, pii(a, c));
		hst.emplace_back(d, pii(a, c));
		vst.emplace_back(a, pii(b, d));
		vst.emplace_back(c, pii(b, d));
	}
	sort(hst.begin(), hst.end());
	sort(vst.begin(), vst.end());
	map<int, int> mp;
	vector<int> v;
	for (i = 1; i <= N; i++) v.push_back(i);
	sort(v.begin(), v.end(), [&](int a, int b) {return point[a].first < point[b].first; });
	int cnt = 0, ptr;
	ptr = 0;
	for (auto x : v) {
		while (ptr < M * 2 && point[x].first >= vst[ptr].first) {
			auto [l, r] = vst[ptr++].second;
			while (1) {
				auto it = mp.lower_bound(l);
				if (it == mp.end()) break;
				if (it->first > r) break;
				mp.erase(it);
			}
		}
		if (mp.find(point[x].second) != mp.end()) edges[++cnt] = pii(x, mp[point[x].second]);
		mp[point[x].second] = x;
	}
	mp.clear();
	sort(v.begin(), v.end(), [&](int a, int b) {return point[a].second < point[b].second; });
	ptr = 0;
	for (auto x : v) {
		while (ptr < M * 2 && point[x].second >= hst[ptr].first) {
			auto [l, r] = hst[ptr++].second;
			while (1) {
				auto it = mp.lower_bound(l);
				if (it == mp.end()) break;
				if (it->first > r) break;
				mp.erase(it);
			}
		}
		if (mp.find(point[x].first) != mp.end()) edges[++cnt] = pii(x, mp[point[x].first]);
		mp[point[x].first] = x;
	}
	for (i = 1; i <= cnt; i++) W[i] = abs(point[edges[i].first].first - point[edges[i].second].first) + abs(point[edges[i].first].second - point[edges[i].second].second);
	for (i = 1; i <= N; i++) p[i] = i;
	vector<int> ev;
	for (i = 1; i <= cnt; i++) ev.push_back(i);
	sort(ev.begin(), ev.end(), [&](int a, int b) {return W[a] < W[b]; });
	int ecnt = 0;
	for (auto e : ev) if (uni(edges[e].first, edges[e].second)) cv[++ecnt] = W[e], psum[ecnt] = psum[ecnt - 1] + cv[ecnt];
	int h;
	while (C--) {
		cin >> b >> h;
		if (ecnt + h < N) {
			cout << -1 << ln;
			continue;
		}
		int ind = lower_bound(cv + 1, cv + ecnt + 1, b) - cv;
		ll ans = 1ll * (N - ind + 1) * b;
		ans += psum[ind - 1];
		cout << ans << ln;
	}
}
# Verdict Execution time Memory Grader output
1 Correct 10 ms 768 KB Output is correct
2 Incorrect 243 ms 10532 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 768 KB Output is correct
2 Incorrect 243 ms 10532 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 768 KB Output is correct
2 Incorrect 243 ms 10532 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 768 KB Output is correct
2 Incorrect 243 ms 10532 KB Output isn't correct
3 Halted 0 ms 0 KB -