답안 #622977

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
622977 2022-08-04T22:25:01 Z izanbf Examination (JOI19_examination) C++14
100 / 100
2372 ms 62248 KB
#include <bits/stdc++.h>
using namespace std;
 
struct Point {
	int x, y, z;
};
 
struct Query {
	int a, b, c, id;
};
 
const int B = 400;
const int MAXSZ = 6e5+9;

int bit[MAXSZ]; // binary/fenwick indexed tree
int sz; // bit size

int bit_sum(int r) {
    int ret = 0;
    for (; r >= 0; r = (r & (r + 1)) - 1)
        ret += bit[r];
    return ret;
}

int bit_sum(int l, int r) {
    return bit_sum(r) - bit_sum(l - 1);
}

void bit_add(int idx, int delta) {
    for (; idx < sz; idx = idx | (idx + 1))
        bit[idx] += delta;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
 
	int N, Q;
	cin >> N >> Q;
 
	set<int> values;
 
	vector<Point> pts(N);
	for (int i = 0; i < N; ++i) {
		Point& p = pts[i];
		cin >> p.x >> p.y;
		p.z = p.x + p.y;
		values.insert(p.x);
		values.insert(p.y);
		values.insert(p.z);
	}
 
	vector<Query> qs(Q);
	for (int i = 0; i < Q; ++i) {
		Query& q = qs[i];
		cin >> q.a >> q.b >> q.c;
		q.id = i;
		values.insert(q.a);
		values.insert(q.b);
		values.insert(q.c);
	}
 
 
	unordered_map<int,int> comp;
	for (int v : values) {
		comp[v] = comp.size();
	}
 
	for (Query& q : qs) {
		q.a = comp[q.a];
		q.b = comp[q.b];
		q.c = comp[q.c];
	}
 
	for (Point& p : pts) {
		p.x = comp[p.x];
		p.y = comp[p.y];
		p.z = comp[p.z];
	}
 
	sz = comp.size() + 2;
 
	sort(qs.begin(), qs.end(), [](const Query& l, const Query& r) {
		return l.c < r.c;
	});
 
	sort(pts.begin(), pts.end(), [](const Point& l, const Point& r) {
		return l.z < r.z;
	});
 
	int blocks = (N+B-1)/B;
	vector<vector<Query>> block_queries(blocks);
	int j = 0;
 
	for (int block = 1; block < blocks; ++block) {
		int i = B*block;
		while (j < Q and qs[j].c <= pts[i].z) {
			block_queries[block-1].push_back(qs[j]);
			++j;
		}
	}
	while (j < Q) {
		block_queries.back().push_back(qs[j]);
		++j;
	}
 
	vector<int> ans(Q);
 
	for (int block = 0; block < blocks; ++block) {
		if (block_queries[block].empty()) continue;
 
		memset(bit, 0, sizeof(int)*sz);
 
		vector<Point> in_block;
		in_block.reserve(B);
		for (int i = B*block; i < N and i < B*(block+1); ++i) {
			in_block.push_back(pts[i]);
		}
 
		vector<Point> over_block;
		over_block.reserve(N-B*block);
		for (int i = B*(block+1); i < N; ++i) {
			over_block.push_back(pts[i]);
			bit_add(pts[i].y, 1);
		}
 
		sort(over_block.begin(), over_block.end(), [&](const Point& l, const Point& r) {
			return l.x > r.x;
		});
 
		sort(block_queries[block].begin(), block_queries[block].end(), [&](const Query& l, const Query& r) {
			return l.a < r.a;
		});
 
		for (const Query& q : block_queries[block]) {
			int cnt_in = 0;
			int cnt_over = 0;
 
			// points in block
			for (const Point& p : in_block) {
				if (p.x >= q.a and p.y >= q.b and p.z >= q.c) ++cnt_in;
			}
 
			// points over block
			while ((not over_block.empty()) and over_block.back().x < q.a) {
				const Point& p = over_block.back();
				bit_add(p.y, -1);
				over_block.pop_back();
			}

			cnt_over = bit_sum(q.b, sz-1);
 
			ans[q.id] = cnt_in + cnt_over;
		}
	}
 
	for (int i = 0; i < Q; ++i) {
		cout << ans[i] << '\n';
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 11 ms 2132 KB Output is correct
8 Correct 11 ms 2196 KB Output is correct
9 Correct 12 ms 2132 KB Output is correct
10 Correct 9 ms 1620 KB Output is correct
11 Correct 10 ms 1664 KB Output is correct
12 Correct 5 ms 468 KB Output is correct
13 Correct 9 ms 1880 KB Output is correct
14 Correct 10 ms 1924 KB Output is correct
15 Correct 9 ms 1948 KB Output is correct
16 Correct 5 ms 1100 KB Output is correct
17 Correct 7 ms 1236 KB Output is correct
18 Correct 2 ms 492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 289 ms 19252 KB Output is correct
2 Correct 253 ms 19440 KB Output is correct
3 Correct 251 ms 19236 KB Output is correct
4 Correct 172 ms 15940 KB Output is correct
5 Correct 203 ms 16012 KB Output is correct
6 Correct 98 ms 6212 KB Output is correct
7 Correct 252 ms 19228 KB Output is correct
8 Correct 243 ms 19212 KB Output is correct
9 Correct 237 ms 18852 KB Output is correct
10 Correct 180 ms 15320 KB Output is correct
11 Correct 160 ms 15188 KB Output is correct
12 Correct 74 ms 6080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 289 ms 19252 KB Output is correct
2 Correct 253 ms 19440 KB Output is correct
3 Correct 251 ms 19236 KB Output is correct
4 Correct 172 ms 15940 KB Output is correct
5 Correct 203 ms 16012 KB Output is correct
6 Correct 98 ms 6212 KB Output is correct
7 Correct 252 ms 19228 KB Output is correct
8 Correct 243 ms 19212 KB Output is correct
9 Correct 237 ms 18852 KB Output is correct
10 Correct 180 ms 15320 KB Output is correct
11 Correct 160 ms 15188 KB Output is correct
12 Correct 74 ms 6080 KB Output is correct
13 Correct 1604 ms 21924 KB Output is correct
14 Correct 1253 ms 19728 KB Output is correct
15 Correct 237 ms 19360 KB Output is correct
16 Correct 1058 ms 16568 KB Output is correct
17 Correct 986 ms 16532 KB Output is correct
18 Correct 148 ms 6792 KB Output is correct
19 Correct 1579 ms 21992 KB Output is correct
20 Correct 1567 ms 20816 KB Output is correct
21 Correct 1459 ms 21828 KB Output is correct
22 Correct 181 ms 15304 KB Output is correct
23 Correct 154 ms 15272 KB Output is correct
24 Correct 74 ms 6208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 11 ms 2132 KB Output is correct
8 Correct 11 ms 2196 KB Output is correct
9 Correct 12 ms 2132 KB Output is correct
10 Correct 9 ms 1620 KB Output is correct
11 Correct 10 ms 1664 KB Output is correct
12 Correct 5 ms 468 KB Output is correct
13 Correct 9 ms 1880 KB Output is correct
14 Correct 10 ms 1924 KB Output is correct
15 Correct 9 ms 1948 KB Output is correct
16 Correct 5 ms 1100 KB Output is correct
17 Correct 7 ms 1236 KB Output is correct
18 Correct 2 ms 492 KB Output is correct
19 Correct 289 ms 19252 KB Output is correct
20 Correct 253 ms 19440 KB Output is correct
21 Correct 251 ms 19236 KB Output is correct
22 Correct 172 ms 15940 KB Output is correct
23 Correct 203 ms 16012 KB Output is correct
24 Correct 98 ms 6212 KB Output is correct
25 Correct 252 ms 19228 KB Output is correct
26 Correct 243 ms 19212 KB Output is correct
27 Correct 237 ms 18852 KB Output is correct
28 Correct 180 ms 15320 KB Output is correct
29 Correct 160 ms 15188 KB Output is correct
30 Correct 74 ms 6080 KB Output is correct
31 Correct 1604 ms 21924 KB Output is correct
32 Correct 1253 ms 19728 KB Output is correct
33 Correct 237 ms 19360 KB Output is correct
34 Correct 1058 ms 16568 KB Output is correct
35 Correct 986 ms 16532 KB Output is correct
36 Correct 148 ms 6792 KB Output is correct
37 Correct 1579 ms 21992 KB Output is correct
38 Correct 1567 ms 20816 KB Output is correct
39 Correct 1459 ms 21828 KB Output is correct
40 Correct 181 ms 15304 KB Output is correct
41 Correct 154 ms 15272 KB Output is correct
42 Correct 74 ms 6208 KB Output is correct
43 Correct 2355 ms 62248 KB Output is correct
44 Correct 2342 ms 62196 KB Output is correct
45 Correct 2016 ms 61896 KB Output is correct
46 Correct 1678 ms 45000 KB Output is correct
47 Correct 1308 ms 44876 KB Output is correct
48 Correct 155 ms 6512 KB Output is correct
49 Correct 1735 ms 62008 KB Output is correct
50 Correct 2372 ms 62236 KB Output is correct
51 Correct 1782 ms 61972 KB Output is correct
52 Correct 981 ms 34424 KB Output is correct
53 Correct 265 ms 26364 KB Output is correct