답안 #477522

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
477522 2021-10-02T11:39:14 Z Abrar_Al_Samit Regions (IOI09_regions) C++17
0 / 100
2139 ms 120092 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 = 400;
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<=R; ++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 8 ms 15176 KB Output isn't correct
2 Incorrect 8 ms 15176 KB Output isn't correct
3 Incorrect 9 ms 15176 KB Output isn't correct
4 Incorrect 13 ms 15176 KB Output isn't correct
5 Incorrect 15 ms 15200 KB Output isn't correct
6 Incorrect 25 ms 15304 KB Output isn't correct
7 Incorrect 35 ms 15176 KB Output isn't correct
8 Incorrect 40 ms 15244 KB Output isn't correct
9 Incorrect 54 ms 15816 KB Output isn't correct
10 Incorrect 85 ms 15744 KB Output isn't correct
11 Incorrect 94 ms 15980 KB Output isn't correct
12 Incorrect 133 ms 16560 KB Output isn't correct
13 Incorrect 161 ms 16140 KB Output isn't correct
14 Incorrect 195 ms 16684 KB Output isn't correct
15 Incorrect 182 ms 20288 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 726 ms 36696 KB Output isn't correct
2 Incorrect 915 ms 29964 KB Output isn't correct
3 Incorrect 1274 ms 31132 KB Output isn't correct
4 Incorrect 163 ms 16712 KB Output isn't correct
5 Incorrect 330 ms 19032 KB Output isn't correct
6 Incorrect 695 ms 71228 KB Output isn't correct
7 Incorrect 1051 ms 43200 KB Output isn't correct
8 Incorrect 975 ms 114252 KB Output isn't correct
9 Incorrect 1389 ms 24384 KB Output isn't correct
10 Incorrect 2005 ms 120092 KB Output isn't correct
11 Incorrect 2139 ms 23832 KB Output isn't correct
12 Incorrect 1018 ms 27116 KB Output isn't correct
13 Incorrect 1225 ms 27728 KB Output isn't correct
14 Incorrect 1798 ms 44816 KB Output isn't correct
15 Incorrect 1852 ms 33416 KB Output isn't correct
16 Incorrect 2075 ms 42732 KB Output isn't correct
17 Incorrect 2060 ms 59068 KB Output isn't correct