Submission #145284

# Submission time Handle Problem Language Result Execution time Memory
145284 2019-08-19T13:27:25 Z maruii 도로 건설 사업 (JOI13_construction) C++14
0 / 100
2001 ms 109740 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 {
	long long 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];
		V[nn << 1] += L[nn] * (m - s + 1);
		V[nn << 1 | 1] += L[nn] * (e - m);
		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] += (e - s + 1) * 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] = 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 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 && W[k] + 1ll * k * a > W[k - 1] + 1ll * (k - 1) * a) --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:45: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:54:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m = ns + ne >> 1;
           ~~~^~~~
construction.cpp: In function 'int main()':
construction.cpp:89:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int ii = 0; ii < in.size(); ++ii) {
                   ~~~^~~~~~~~~~~
construction.cpp:97: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:98: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:120:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0, si = 0; i < xx.size(); ++i) {
                          ~~^~~~~~~~~~~
construction.cpp:121:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (; si < xsp.size() && xsp[si].ff.ff <= i; ++si) {
          ~~~^~~~~~~~~~~~
construction.cpp:126:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j + 1 < vec.size(); ++j) {
                   ~~~~~~^~~~~~~~~~~~
construction.cpp:136:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0, si = 0; i < yy.size(); ++i) {
                          ~~^~~~~~~~~~~
construction.cpp:137:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (; si < ysp.size() && ysp[si].ff.ff <= i; ++si) {
          ~~~^~~~~~~~~~~~
construction.cpp:142:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j + 1 < vec.size(); ++j) {
                   ~~~~~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 83 ms 62708 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1715 ms 92652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 690 ms 94420 KB Output is correct
2 Correct 719 ms 93136 KB Output is correct
3 Correct 719 ms 91420 KB Output is correct
4 Incorrect 634 ms 92132 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2001 ms 109740 KB Output isn't correct
2 Halted 0 ms 0 KB -