답안 #477499

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
477499 2021-10-02T10:16:46 Z Abrar_Al_Samit Regions (IOI09_regions) C++17
0 / 100
2310 ms 59068 KB
#include<bits/stdc++.h>
using namespace std;
const int MX = 200005;
struct FenwickTree {
    vector<int> bit;  // binary indexed tree
    int n = MX;

    int sum(int r) {
    	if(bit.empty()) bit.resize(n);
        int ret = 0;
        for (; r >= 0; r = (r & (r + 1)) - 1)
            ret += bit[r];
        return ret;
    }

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

    void add(int idx, int delta) {
    	if(bit.empty()) bit.resize(n);
        for (; idx < n; idx = idx | (idx + 1))
            bit[idx] += delta;
    }
};
const int B = 500;
int N, R, Q;
vector <int> g[MX], regionAll[MX], regionEl[MX];
int H[MX], st[MX], en[MX], timer=1;
int found[MX];
map <int, vector <int>> prep;
void Flat(int v, int p) {
	st[v] = timer++;
	if(!found[H[v]]) {
		found[H[v]] = st[v];
		regionEl[H[v]].push_back(v);
	}
	regionAll[H[v]].push_back(v);
	for(auto to : g[v]) if(to!=p) {
		Flat(to, v);
	}
	en[v] = timer-1;
	if(found[H[v]]==st[v]) {
		found[H[v]] = 0;
	}
}
int main() {
	cin >> N >> R >> Q;
	cin >> H[1];
	for(int i=2; i<=N; ++i) {
		int p; cin >> p >> H[i];
		g[p].push_back(i);
	}
	Flat(1, 1);
	vector <int> bigs;
	for(int i=1; i<=R; ++i) if(regionAll[i].size()>B) {
		bigs.push_back(i);
	}
	int sz_big = bigs.size();
	FenwickTree A;
	for(int all=1; all<=25000; ++all) {
		for(auto it : regionAll[all]) {
			A.add(st[it], 1);
		}
		for(auto b : bigs) {
			if(prep[b].empty()) prep[b].resize(25001);
			for(auto it : regionEl[b]) {
				prep[b][all] = A.sum(st[it], en[it]);
			}
		}
		for(auto it : regionAll[all]) {
			A.add(st[it], -1);
		}
	}
	map <int, FenwickTree> sb;
	for(auto b : bigs) {
		for(auto it : regionAll[b]) {
			sb[b].add(st[it], 1);
		}
	}
	while(Q--) {
		int r1, r2;
		cin >> r1 >> r2;
		int ans = 0;
		if(regionAll[r1].size()>B) {
			ans = prep[r1][r2];
		} else {
			if(regionAll[r2].size()>B) {
				for(auto it : regionEl[r1]) {
					ans += sb[r2].sum(st[it], en[it]);
				}
			} else {
				int p1 = 0, p2 = 0;
				while(p1<regionEl[r1].size() && p2<regionAll[r2].size()) {
					auto ok = [&] (int p1, int p2) {
						return st[regionEl[r1][p1]]<=st[regionAll[r2][p2]] &&
						en[regionEl[r1][p1]]>=en[regionAll[r2][p2]];
					};
					while(p2<regionAll[r2].size() && ok(p1, p2)) ++p2, ++ans;
					while(p2<regionAll[r2].size() && st[regionAll[r2][p2]]<st[regionEl[r1][p1]]) ++p2;
					if(p2==regionAll[r2].size()) continue;
					while(p1<regionEl[r1].size() && en[regionEl[r1][p1]]<st[regionAll[r2][p2]]) ++p1;
				}
			}
		}
		cout << ans << endl;
	}
	return 0;
}

Compilation message

regions.cpp: In function 'int main()':
regions.cpp:94:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |     while(p1<regionEl[r1].size() && p2<regionAll[r2].size()) {
      |           ~~^~~~~~~~~~~~~~~~~~~~
regions.cpp:94:39: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |     while(p1<regionEl[r1].size() && p2<regionAll[r2].size()) {
      |                                     ~~^~~~~~~~~~~~~~~~~~~~~
regions.cpp:99:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |      while(p2<regionAll[r2].size() && ok(p1, p2)) ++p2, ++ans;
      |            ~~^~~~~~~~~~~~~~~~~~~~~
regions.cpp:100:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |      while(p2<regionAll[r2].size() && st[regionAll[r2][p2]]<st[regionEl[r1][p1]]) ++p2;
      |            ~~^~~~~~~~~~~~~~~~~~~~~
regions.cpp:101:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |      if(p2==regionAll[r2].size()) continue;
      |         ~~^~~~~~~~~~~~~~~~~~~~~~
regions.cpp:102:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |      while(p1<regionEl[r1].size() && en[regionEl[r1][p1]]<st[regionAll[r2][p2]]) ++p1;
      |            ~~^~~~~~~~~~~~~~~~~~~~
regions.cpp:59:6: warning: unused variable 'sz_big' [-Wunused-variable]
   59 |  int sz_big = bigs.size();
      |      ^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 15176 KB Output isn't correct
2 Incorrect 11 ms 15140 KB Output isn't correct
3 Incorrect 11 ms 15176 KB Output isn't correct
4 Incorrect 13 ms 15176 KB Output isn't correct
5 Incorrect 16 ms 15200 KB Output isn't correct
6 Incorrect 29 ms 15304 KB Output isn't correct
7 Incorrect 42 ms 15176 KB Output isn't correct
8 Incorrect 45 ms 15304 KB Output isn't correct
9 Incorrect 67 ms 15816 KB Output isn't correct
10 Incorrect 101 ms 15688 KB Output isn't correct
11 Incorrect 118 ms 15944 KB Output isn't correct
12 Incorrect 148 ms 16508 KB Output isn't correct
13 Incorrect 186 ms 16200 KB Output isn't correct
14 Incorrect 189 ms 16584 KB Output isn't correct
15 Incorrect 209 ms 20296 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 825 ms 30512 KB Output isn't correct
2 Incorrect 1220 ms 29844 KB Output isn't correct
3 Incorrect 1474 ms 31144 KB Output isn't correct
4 Incorrect 286 ms 16704 KB Output isn't correct
5 Incorrect 260 ms 18988 KB Output isn't correct
6 Incorrect 626 ms 18132 KB Output isn't correct
7 Incorrect 917 ms 19112 KB Output isn't correct
8 Incorrect 952 ms 25792 KB Output isn't correct
9 Incorrect 1498 ms 24576 KB Output isn't correct
10 Incorrect 1870 ms 31732 KB Output isn't correct
11 Incorrect 2310 ms 23936 KB Output isn't correct
12 Incorrect 1177 ms 27120 KB Output isn't correct
13 Incorrect 1263 ms 27736 KB Output isn't correct
14 Incorrect 1772 ms 44816 KB Output isn't correct
15 Incorrect 1853 ms 33416 KB Output isn't correct
16 Incorrect 1892 ms 42728 KB Output isn't correct
17 Incorrect 1856 ms 59068 KB Output isn't correct