답안 #145295

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
145295 2019-08-19T14:11:55 Z maruii 도로 건설 사업 (JOI13_construction) C++14
30 / 100
1698 ms 94456 KB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
#define ff first
#define ss second
#define eack emplace_back
#define pack push_back

vector<int> xx, yy;
vector<pii> in, xnode[600005], ynode[600005];
vector<pair<pii, pii> > in2, xsp, ysp;
long long W[200005];

int upa[200005];
int fnd(int x) {return upa[x] == x ? x : upa[x] = fnd(upa[x]);}
bool uni(int x, int y) {
	x = fnd(x), y = fnd(y);
	if (x == y) return 0;
	upa[y] = x;
	return 1;
}

const int SIZE = 1 << 20;
struct ST {
	int V[2 * SIZE], L[2 * SIZE];
	int sz;
	void init() {
		memset(V, 0, sizeof(V));
		memset(L, 0, sizeof(L));
	}
	void Ldown(int nn, int s, int m, int e) {
		L[nn << 1] += L[nn];
		L[nn << 1 | 1] += L[nn];
		L[nn] = 0;
	}
	void update(int s, int e, int v, int nn, int ns, int ne) {
		if (ns > e || ne < s) return;
		if (s <= ns && ne <= e) {
			V[nn] += v;
			L[nn] += v;
			return;
		}
		int m = ns + ne >> 1;
		Ldown(nn, ns, m, ne);
		update(s, e, v, nn << 1, ns, m);
		update(s, e, v, nn << 1 | 1, m + 1, ne);
		V[nn] = max(V[nn << 1], V[nn << 1 | 1]);
	}
	long long query(int s, int e, int nn, int ns, int ne) {
		if (ns > e || ne < s) return 0;
		if (s <= ns && ne <= e) return V[nn];
		int m = ns + ne >> 1;
		Ldown(nn, ns, m, ne);
		return max(query(s, e, nn << 1, ns, m), query(s, e, nn << 1 | 1, m + 1, ne));
	}
	void update(int s, int e, int v) {
		update(s, e, v, 1, 0, sz);
	}
	long long query(int s, int e) {
		return query(s, e, 1, 0, sz);
	}
} seg;

int main() {
	ios_base::sync_with_stdio(0), cin.tie(0);
	int N, M, C; cin >> N >> M >> C;
	for (int i = 0; i < N; ++i) {
		int x, y; cin >> x >> y;
		xx.eack(x);
		yy.eack(y);
		in.eack(x, y);
	}
	
	for (int i = 0; i < M; ++i) {
		int p, q, r, s; cin >> p >> q >> r >> s;
		xx.eack(p); xx.eack(r);
		yy.eack(q); yy.eack(s);
		in2.eack(pii(p, q), pii(r, s));
	}	
		
	sort(xx.begin(), xx.end());
	sort(yy.begin(), yy.end());
	xx.erase(unique(xx.begin(), xx.end()), xx.end());
	yy.erase(unique(yy.begin(), yy.end()), yy.end());
	iota(upa, upa + N, 0);

	for (int ii = 0; ii < in.size(); ++ii) {
		auto i = in[ii];
		i.ff = lower_bound(xx.begin(), xx.end(), i.ff) - xx.begin();
		i.ss = lower_bound(yy.begin(), yy.end(), i.ss) - yy.begin();
		xnode[i.ff].eack(i.ss, ii);
		ynode[i.ss].eack(i.ff, ii);
	}
	
	for (int i = 0; i < xx.size(); ++i) sort(xnode[i].begin(), xnode[i].end());
	for (int i = 0; i < yy.size(); ++i) sort(ynode[i].begin(), ynode[i].end());

	for (auto i : in2) {
		int p, q, r, s;
		tie(p, q) = i.ff;
		tie(r, s) = i.ss;
		p = lower_bound(xx.begin(), xx.end(), p) - xx.begin();
		r = lower_bound(xx.begin(), xx.end(), r) - xx.begin();
		q = lower_bound(yy.begin(), yy.end(), q) - yy.begin();
		s = lower_bound(yy.begin(), yy.end(), s) - yy.begin();
		xsp.eack(pii(p, 1), pii(q, s));
		xsp.eack(pii(r + 1, -1), pii(q, s));
		ysp.eack(pii(q, 1), pii(p, r));
		ysp.eack(pii(s + 1, -1), pii(p, r));
	}
	
	sort(xsp.begin(), xsp.end());
	sort(ysp.begin(), ysp.end());

	vector<pair<int, pii> > E;
	seg.sz = (int)yy.size() - 1;

	for (int i = 0, si = 0; i < xx.size(); ++i) {
		for (; si < xsp.size() && xsp[si].ff.ff <= i; ++si) {
			seg.update(xsp[si].ss.ff, xsp[si].ss.ss, xsp[si].ff.ss);
		}
		
		auto &vec = xnode[i];
		for (int j = 0; j + 1 < vec.size(); ++j) {
			if (seg.query(vec[j].ff, vec[j + 1].ff) == 0) {
				E.eack(yy[vec[j + 1].ff] - yy[vec[j].ff], pii(vec[j].ss, vec[j + 1].ss));
			}
		}
	}

	seg.init();
	seg.sz = (int)xx.size() - 1;

	for (int i = 0, si = 0; i < yy.size(); ++i) {
		for (; si < ysp.size() && ysp[si].ff.ff <= i; ++si) {
			seg.update(ysp[si].ss.ff, ysp[si].ss.ss, ysp[si].ff.ss);
		}

		auto &vec = ynode[i];
		for (int j = 0; j + 1 < vec.size(); ++j) {
			if (seg.query(vec[j].ff, vec[j + 1].ff) == 0) {
				E.eack(xx[vec[j + 1].ff] - xx[vec[j].ff], pii(vec[j].ss, vec[j + 1].ss));
			}
		}
	}

	sort(E.begin(), E.end());
	int K = N;
	for (auto i : E) {
		if (uni(i.ss.ff, i.ss.ss)) {
			--K;
			W[K] = W[K + 1] + i.ff;
		}
	}

	vector<pair<pii, int> > qry(C);
	vector<long long> ans(C);
	
	for (int i = 0; i < C; ++i) {
		int a, b; cin >> a >> b;
		qry[i] = {pii(a, b), i};
	}
	
	sort(qry.begin(), qry.end());

	for (int i = 0, k = N; i < C; ++i) {
		if (qry[i].ff.ss < K) {
			ans[qry[i].ss] = -1;
			continue;
		}
		int a, b; tie(a, b) = qry[i].ff;
		while (k > K && a >= W[k - 1] - W[k]) --k;
		ans[qry[i].ss] = W[min(b, k)] + 1ll * min(b, k) * a;
	}
	
	for (auto i : ans) cout << i << '\n';
	return 0;
}

Compilation message

construction.cpp: In member function 'void ST::update(int, int, int, int, int, int)':
construction.cpp:43:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns + ne >> 1;
           ~~~^~~~
construction.cpp: In member function 'long long int ST::query(int, int, int, int, int)':
construction.cpp:52:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns + ne >> 1;
           ~~~^~~~
construction.cpp: In function 'int main()':
construction.cpp:87:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int ii = 0; ii < in.size(); ++ii) {
                   ~~~^~~~~~~~~~~
construction.cpp:95:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < xx.size(); ++i) sort(xnode[i].begin(), xnode[i].end());
                  ~~^~~~~~~~~~~
construction.cpp:96:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < yy.size(); ++i) sort(ynode[i].begin(), ynode[i].end());
                  ~~^~~~~~~~~~~
construction.cpp:118:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0, si = 0; i < xx.size(); ++i) {
                          ~~^~~~~~~~~~~
construction.cpp:119:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (; si < xsp.size() && xsp[si].ff.ff <= i; ++si) {
          ~~~^~~~~~~~~~~~
construction.cpp:124:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j + 1 < vec.size(); ++j) {
                   ~~~~~~^~~~~~~~~~~~
construction.cpp:134:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0, si = 0; i < yy.size(); ++i) {
                          ~~^~~~~~~~~~~
construction.cpp:135:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (; si < ysp.size() && ysp[si].ff.ff <= i; ++si) {
          ~~~^~~~~~~~~~~~
construction.cpp:140:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j + 1 < vec.size(); ++j) {
                   ~~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 67 ms 46452 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1450 ms 77888 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 689 ms 79632 KB Output is correct
2 Correct 695 ms 78664 KB Output is correct
3 Correct 677 ms 76756 KB Output is correct
4 Correct 605 ms 77636 KB Output is correct
5 Correct 645 ms 84940 KB Output is correct
6 Correct 681 ms 90960 KB Output is correct
7 Correct 666 ms 89044 KB Output is correct
8 Correct 661 ms 88144 KB Output is correct
9 Correct 451 ms 84936 KB Output is correct
10 Correct 565 ms 86808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1698 ms 94456 KB Output isn't correct
2 Halted 0 ms 0 KB -