답안 #128466

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
128466 2019-07-11T00:59:16 Z qkxwsm 새 집 (APIO18_new_home) C++14
57 / 100
5000 ms 288480 KB
#include <bits/stdc++.h>

using namespace std;

template<class T, class U>
void ckmin(T &a, U b)
{
	if (a > b) a = b;
}
template<class T, class U>
void ckmax(T &a, U b)
{
	if (a < b) a = b;
}

#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)
#define SZ(x) ((int) ((x).size()))
#define ALL(x) (x).begin(), (x).end()
#define LIM 100000007
#define INF 1000000007
#define LLINF 2696969696969696969ll
#define MAXN 300013

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;
typedef pair<pii, pii> ppp;
typedef pair<pii, int> ppi;

int N, K, Q, S;
ppp arr[MAXN];
ppi quer[MAXN];
int ans[MAXN];
multiset<int> pts[MAXN];
vector<array<int, 4> > segments;
vector<array<int, 4> > events;
unordered_map<ll, vi> cancer;
vpi seg[MAXN << 2];
int iter[MAXN << 2];
vi compress;

void ins(int l, int r, int t)
{
	l = (l + r + 1) >> 1;
	cancer[1ll * INF * l + r].PB(SZ(segments));
	segments.PB({l, r, t, Q + 2});
}
void del(int l, int r, int t)
{
	l = (l + r + 1) >> 1;
	auto it = cancer.find(1ll * INF * l + r);
	segments[it -> se.back()][3] = t;
	it -> se.pop_back();
}

void inseg(int w, int L, int R, int a, int b, pii p)
{
	if (a <= L && R <= b)
	{
		if (seg[w].empty() || p.se > seg[w].back().se) seg[w].PB(p);
		return;
	}
	int mid = (L + R) >> 1;
	if (a <= mid) inseg(w << 1, L, mid, a, b, p);
	if (mid < b) inseg(w << 1 | 1, mid + 1, R, a, b, p);
	return;
}
int query(int w, int L, int R, int a, int x)
{
	int res = -INF;
	while(iter[w] + 1 < SZ(seg[w]) && seg[w][iter[w] + 1].fi <= x)
	{
		iter[w]++;
	}
	if (iter[w] < SZ(seg[w]) && seg[w][iter[w]].fi <= x)
	{
		res = -x + seg[w][iter[w]].se;
	}
	if (L == R) return res;
	int mid = (L + R) >> 1;
	if (a <= mid) ckmax(res, query(w << 1, L, mid, a, x));
	else ckmax(res, query(w << 1 | 1, mid + 1, R, a, x));
	return res;
}

void solve()
{
	FOR(i, 0, (1 << (33 - __builtin_clz(Q + 2))) + 1)
	{
		seg[i].clear();
		iter[i] = 0;
	}
	events.clear();
	cancer.clear();
	segments.clear();
	FOR(i, 0, K) pts[i].clear();
	FOR(i, 0, N)
	{
		int t1 = arr[i].se.fi, t2 = arr[i].se.se, ty = arr[i].fi.fi, x = arr[i].fi.se;
		if (t1 == t2) continue;
		events.PB({t1, -1, ty, x});
		events.PB({t2, -2, ty, x});
	}
	sort(ALL(events));
	FOR(i, 0, K)
	{
		pts[i].insert(2 * LIM);
		pts[i].insert(-2 * LIM);
		ins(-2 * LIM, 2 * LIM, 0);
	}
	FOR(i, 0, SZ(events))
	{
		int t = events[i][0], typ = events[i][2], pos = events[i][3];
		if (events[i][1] == -1)
		{
			auto it = pts[typ].UB(pos);
			int rt = *it, lt = *prev(it);
			pts[typ].insert(pos);
			ins(lt, pos, t + 1);
			ins(pos, rt, t + 1);
			del(lt, rt, t);
		}
		if (events[i][1] == -2)
		{
			pts[typ].erase(pts[typ].find(pos));
			auto it = pts[typ].UB(pos);
			int rt = *it, lt = *prev(it);
			del(lt, pos, t);
			del(pos, rt, t);
			ins(lt, rt, t + 1);
		}
	}
	sort(ALL(segments));
	FOR(i, 0, SZ(segments))
	{
		int l = segments[i][2], r = segments[i][3];
		if (l > r) continue;
		inseg(1, 0, Q + 2, l, r, {segments[i][0], segments[i][1]});
	}
	FOR(i, 0, Q)
	{
		ckmax(ans[quer[i].se], query(1, 0, Q + 2, quer[i].fi.se + 1, quer[i].fi.fi));
	}
}
bool cmp(ppi a, ppi b)
{
	return a.fi.se < b.fi.se;
}

int32_t main()
{
	if (fopen("file.in", "r"))
	{
		freopen("file.in", "r", stdin);
		freopen("file.out", "w", stdout);
	}
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> N >> K >> Q;
	FOR(i, 0, N)
	{
		cin >> arr[i].fi.se >> arr[i].fi.fi >> arr[i].se.fi >> arr[i].se.se;
		arr[i].fi.fi--; arr[i].se.se++;
	}
	FOR(i, 0, Q)
	{
		cin >> quer[i].fi.fi >> quer[i].fi.se; quer[i].se = i;
		compress.PB(quer[i].fi.se);
	}
	compress.PB(INF);
	compress.PB(0);
	sort(ALL(compress)); compress.erase(unique(ALL(compress)), compress.end());
	FOR(i, 0, Q)
	{
		quer[i].fi.se = LB(ALL(compress), quer[i].fi.se) - compress.begin();
	}
	FOR(i, 0, N)
	{
		arr[i].se.fi = LB(ALL(compress), arr[i].se.fi) - compress.begin();
		arr[i].se.se = LB(ALL(compress), arr[i].se.se) - compress.begin();
	}
	sort(arr, arr + N);
	sort(quer, quer + Q);
	solve();
	FOR(i, 0, N)
	{
		arr[i].fi.se = 100000001 - arr[i].fi.se;
	}
	FOR(i, 0, Q)
	{
		quer[i].fi.fi = 100000001 - quer[i].fi.fi;
	}
	reverse(quer, quer + Q);
	solve();
	FOR(i, 0, Q)
	{
		if (ans[i] >= LIM)
		{
			cout << "-1\n";
			continue;
		}
		cout << ans[i] << '\n';
	}
	// cerr << "time elapsed = " << clock() / ((CLOCKS_PER_SEC) / 1000) << " ms" << endl;
	return 0;
}

Compilation message

new_home.cpp: In function 'int32_t main()':
new_home.cpp:166:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen("file.in", "r", stdin);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:167:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen("file.out", "w", stdout);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 42616 KB Output is correct
2 Correct 41 ms 42660 KB Output is correct
3 Correct 41 ms 42588 KB Output is correct
4 Correct 43 ms 42744 KB Output is correct
5 Correct 42 ms 42744 KB Output is correct
6 Correct 44 ms 42848 KB Output is correct
7 Correct 44 ms 42904 KB Output is correct
8 Correct 43 ms 42872 KB Output is correct
9 Correct 43 ms 42744 KB Output is correct
10 Correct 43 ms 42928 KB Output is correct
11 Correct 43 ms 42744 KB Output is correct
12 Correct 43 ms 42744 KB Output is correct
13 Correct 43 ms 42744 KB Output is correct
14 Correct 43 ms 42864 KB Output is correct
15 Correct 44 ms 43000 KB Output is correct
16 Correct 43 ms 42872 KB Output is correct
17 Correct 43 ms 42872 KB Output is correct
18 Correct 44 ms 42872 KB Output is correct
19 Correct 43 ms 42872 KB Output is correct
20 Correct 43 ms 42872 KB Output is correct
21 Correct 43 ms 42872 KB Output is correct
22 Correct 44 ms 42872 KB Output is correct
23 Correct 43 ms 42872 KB Output is correct
24 Correct 43 ms 43000 KB Output is correct
25 Correct 43 ms 42872 KB Output is correct
26 Correct 42 ms 42872 KB Output is correct
27 Correct 43 ms 42744 KB Output is correct
28 Correct 42 ms 42872 KB Output is correct
29 Correct 43 ms 42744 KB Output is correct
30 Correct 43 ms 42744 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 42616 KB Output is correct
2 Correct 41 ms 42660 KB Output is correct
3 Correct 41 ms 42588 KB Output is correct
4 Correct 43 ms 42744 KB Output is correct
5 Correct 42 ms 42744 KB Output is correct
6 Correct 44 ms 42848 KB Output is correct
7 Correct 44 ms 42904 KB Output is correct
8 Correct 43 ms 42872 KB Output is correct
9 Correct 43 ms 42744 KB Output is correct
10 Correct 43 ms 42928 KB Output is correct
11 Correct 43 ms 42744 KB Output is correct
12 Correct 43 ms 42744 KB Output is correct
13 Correct 43 ms 42744 KB Output is correct
14 Correct 43 ms 42864 KB Output is correct
15 Correct 44 ms 43000 KB Output is correct
16 Correct 43 ms 42872 KB Output is correct
17 Correct 43 ms 42872 KB Output is correct
18 Correct 44 ms 42872 KB Output is correct
19 Correct 43 ms 42872 KB Output is correct
20 Correct 43 ms 42872 KB Output is correct
21 Correct 43 ms 42872 KB Output is correct
22 Correct 44 ms 42872 KB Output is correct
23 Correct 43 ms 42872 KB Output is correct
24 Correct 43 ms 43000 KB Output is correct
25 Correct 43 ms 42872 KB Output is correct
26 Correct 42 ms 42872 KB Output is correct
27 Correct 43 ms 42744 KB Output is correct
28 Correct 42 ms 42872 KB Output is correct
29 Correct 43 ms 42744 KB Output is correct
30 Correct 43 ms 42744 KB Output is correct
31 Correct 1130 ms 80328 KB Output is correct
32 Correct 268 ms 53224 KB Output is correct
33 Correct 1054 ms 86788 KB Output is correct
34 Correct 958 ms 77636 KB Output is correct
35 Correct 1112 ms 82956 KB Output is correct
36 Correct 1151 ms 88168 KB Output is correct
37 Correct 785 ms 80892 KB Output is correct
38 Correct 823 ms 83428 KB Output is correct
39 Correct 651 ms 76612 KB Output is correct
40 Correct 685 ms 78600 KB Output is correct
41 Correct 767 ms 75364 KB Output is correct
42 Correct 778 ms 75468 KB Output is correct
43 Correct 240 ms 54120 KB Output is correct
44 Correct 766 ms 75236 KB Output is correct
45 Correct 749 ms 74468 KB Output is correct
46 Correct 649 ms 71780 KB Output is correct
47 Correct 503 ms 69764 KB Output is correct
48 Correct 479 ms 68860 KB Output is correct
49 Correct 552 ms 72240 KB Output is correct
50 Correct 653 ms 74144 KB Output is correct
51 Correct 566 ms 71384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3402 ms 181108 KB Output is correct
2 Correct 3560 ms 175572 KB Output is correct
3 Correct 3655 ms 286160 KB Output is correct
4 Correct 3360 ms 193640 KB Output is correct
5 Correct 3921 ms 256064 KB Output is correct
6 Correct 3673 ms 189656 KB Output is correct
7 Correct 3603 ms 288480 KB Output is correct
8 Correct 3448 ms 196180 KB Output is correct
9 Correct 3317 ms 170556 KB Output is correct
10 Correct 3316 ms 161000 KB Output is correct
11 Correct 3259 ms 164640 KB Output is correct
12 Correct 3130 ms 160264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5019 ms 196920 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 42616 KB Output is correct
2 Correct 41 ms 42660 KB Output is correct
3 Correct 41 ms 42588 KB Output is correct
4 Correct 43 ms 42744 KB Output is correct
5 Correct 42 ms 42744 KB Output is correct
6 Correct 44 ms 42848 KB Output is correct
7 Correct 44 ms 42904 KB Output is correct
8 Correct 43 ms 42872 KB Output is correct
9 Correct 43 ms 42744 KB Output is correct
10 Correct 43 ms 42928 KB Output is correct
11 Correct 43 ms 42744 KB Output is correct
12 Correct 43 ms 42744 KB Output is correct
13 Correct 43 ms 42744 KB Output is correct
14 Correct 43 ms 42864 KB Output is correct
15 Correct 44 ms 43000 KB Output is correct
16 Correct 43 ms 42872 KB Output is correct
17 Correct 43 ms 42872 KB Output is correct
18 Correct 44 ms 42872 KB Output is correct
19 Correct 43 ms 42872 KB Output is correct
20 Correct 43 ms 42872 KB Output is correct
21 Correct 43 ms 42872 KB Output is correct
22 Correct 44 ms 42872 KB Output is correct
23 Correct 43 ms 42872 KB Output is correct
24 Correct 43 ms 43000 KB Output is correct
25 Correct 43 ms 42872 KB Output is correct
26 Correct 42 ms 42872 KB Output is correct
27 Correct 43 ms 42744 KB Output is correct
28 Correct 42 ms 42872 KB Output is correct
29 Correct 43 ms 42744 KB Output is correct
30 Correct 43 ms 42744 KB Output is correct
31 Correct 1130 ms 80328 KB Output is correct
32 Correct 268 ms 53224 KB Output is correct
33 Correct 1054 ms 86788 KB Output is correct
34 Correct 958 ms 77636 KB Output is correct
35 Correct 1112 ms 82956 KB Output is correct
36 Correct 1151 ms 88168 KB Output is correct
37 Correct 785 ms 80892 KB Output is correct
38 Correct 823 ms 83428 KB Output is correct
39 Correct 651 ms 76612 KB Output is correct
40 Correct 685 ms 78600 KB Output is correct
41 Correct 767 ms 75364 KB Output is correct
42 Correct 778 ms 75468 KB Output is correct
43 Correct 240 ms 54120 KB Output is correct
44 Correct 766 ms 75236 KB Output is correct
45 Correct 749 ms 74468 KB Output is correct
46 Correct 649 ms 71780 KB Output is correct
47 Correct 503 ms 69764 KB Output is correct
48 Correct 479 ms 68860 KB Output is correct
49 Correct 552 ms 72240 KB Output is correct
50 Correct 653 ms 74144 KB Output is correct
51 Correct 566 ms 71384 KB Output is correct
52 Correct 896 ms 83972 KB Output is correct
53 Correct 833 ms 78836 KB Output is correct
54 Correct 991 ms 77840 KB Output is correct
55 Correct 858 ms 79804 KB Output is correct
56 Correct 843 ms 80840 KB Output is correct
57 Correct 797 ms 76652 KB Output is correct
58 Correct 827 ms 77496 KB Output is correct
59 Correct 912 ms 78984 KB Output is correct
60 Correct 890 ms 76048 KB Output is correct
61 Correct 308 ms 60720 KB Output is correct
62 Correct 904 ms 83860 KB Output is correct
63 Correct 1006 ms 80996 KB Output is correct
64 Correct 1066 ms 80484 KB Output is correct
65 Correct 957 ms 78444 KB Output is correct
66 Correct 829 ms 76256 KB Output is correct
67 Correct 339 ms 53868 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 42616 KB Output is correct
2 Correct 41 ms 42660 KB Output is correct
3 Correct 41 ms 42588 KB Output is correct
4 Correct 43 ms 42744 KB Output is correct
5 Correct 42 ms 42744 KB Output is correct
6 Correct 44 ms 42848 KB Output is correct
7 Correct 44 ms 42904 KB Output is correct
8 Correct 43 ms 42872 KB Output is correct
9 Correct 43 ms 42744 KB Output is correct
10 Correct 43 ms 42928 KB Output is correct
11 Correct 43 ms 42744 KB Output is correct
12 Correct 43 ms 42744 KB Output is correct
13 Correct 43 ms 42744 KB Output is correct
14 Correct 43 ms 42864 KB Output is correct
15 Correct 44 ms 43000 KB Output is correct
16 Correct 43 ms 42872 KB Output is correct
17 Correct 43 ms 42872 KB Output is correct
18 Correct 44 ms 42872 KB Output is correct
19 Correct 43 ms 42872 KB Output is correct
20 Correct 43 ms 42872 KB Output is correct
21 Correct 43 ms 42872 KB Output is correct
22 Correct 44 ms 42872 KB Output is correct
23 Correct 43 ms 42872 KB Output is correct
24 Correct 43 ms 43000 KB Output is correct
25 Correct 43 ms 42872 KB Output is correct
26 Correct 42 ms 42872 KB Output is correct
27 Correct 43 ms 42744 KB Output is correct
28 Correct 42 ms 42872 KB Output is correct
29 Correct 43 ms 42744 KB Output is correct
30 Correct 43 ms 42744 KB Output is correct
31 Correct 1130 ms 80328 KB Output is correct
32 Correct 268 ms 53224 KB Output is correct
33 Correct 1054 ms 86788 KB Output is correct
34 Correct 958 ms 77636 KB Output is correct
35 Correct 1112 ms 82956 KB Output is correct
36 Correct 1151 ms 88168 KB Output is correct
37 Correct 785 ms 80892 KB Output is correct
38 Correct 823 ms 83428 KB Output is correct
39 Correct 651 ms 76612 KB Output is correct
40 Correct 685 ms 78600 KB Output is correct
41 Correct 767 ms 75364 KB Output is correct
42 Correct 778 ms 75468 KB Output is correct
43 Correct 240 ms 54120 KB Output is correct
44 Correct 766 ms 75236 KB Output is correct
45 Correct 749 ms 74468 KB Output is correct
46 Correct 649 ms 71780 KB Output is correct
47 Correct 503 ms 69764 KB Output is correct
48 Correct 479 ms 68860 KB Output is correct
49 Correct 552 ms 72240 KB Output is correct
50 Correct 653 ms 74144 KB Output is correct
51 Correct 566 ms 71384 KB Output is correct
52 Correct 3402 ms 181108 KB Output is correct
53 Correct 3560 ms 175572 KB Output is correct
54 Correct 3655 ms 286160 KB Output is correct
55 Correct 3360 ms 193640 KB Output is correct
56 Correct 3921 ms 256064 KB Output is correct
57 Correct 3673 ms 189656 KB Output is correct
58 Correct 3603 ms 288480 KB Output is correct
59 Correct 3448 ms 196180 KB Output is correct
60 Correct 3317 ms 170556 KB Output is correct
61 Correct 3316 ms 161000 KB Output is correct
62 Correct 3259 ms 164640 KB Output is correct
63 Correct 3130 ms 160264 KB Output is correct
64 Execution timed out 5019 ms 196920 KB Time limit exceeded
65 Halted 0 ms 0 KB -