답안 #477498

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
477498 2021-10-02T10:15:06 Z Abrar_Al_Samit Regions (IOI09_regions) C++17
0 / 100
2035 ms 120080 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<=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 8 ms 15176 KB Output isn't correct
2 Incorrect 8 ms 15176 KB Output isn't correct
3 Incorrect 10 ms 15176 KB Output isn't correct
4 Incorrect 11 ms 15176 KB Output isn't correct
5 Incorrect 16 ms 15124 KB Output isn't correct
6 Incorrect 25 ms 15304 KB Output isn't correct
7 Incorrect 39 ms 15292 KB Output isn't correct
8 Incorrect 25 ms 15304 KB Output isn't correct
9 Incorrect 51 ms 15816 KB Output isn't correct
10 Incorrect 86 ms 15688 KB Output isn't correct
11 Incorrect 119 ms 15916 KB Output isn't correct
12 Incorrect 113 ms 16584 KB Output isn't correct
13 Incorrect 168 ms 16196 KB Output isn't correct
14 Incorrect 190 ms 16704 KB Output isn't correct
15 Incorrect 218 ms 20320 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 776 ms 36688 KB Output isn't correct
2 Incorrect 1166 ms 29844 KB Output isn't correct
3 Incorrect 1307 ms 31132 KB Output isn't correct
4 Incorrect 273 ms 16840 KB Output isn't correct
5 Incorrect 326 ms 19004 KB Output isn't correct
6 Incorrect 1102 ms 71192 KB Output isn't correct
7 Incorrect 1262 ms 43092 KB Output isn't correct
8 Incorrect 1121 ms 114252 KB Output isn't correct
9 Incorrect 1374 ms 24424 KB Output isn't correct
10 Incorrect 1880 ms 120080 KB Output isn't correct
11 Incorrect 2035 ms 23872 KB Output isn't correct
12 Incorrect 1109 ms 27120 KB Output isn't correct
13 Incorrect 1199 ms 27736 KB Output isn't correct
14 Incorrect 1688 ms 44808 KB Output isn't correct
15 Incorrect 1862 ms 33416 KB Output isn't correct
16 Incorrect 1880 ms 42732 KB Output isn't correct
17 Incorrect 1932 ms 59060 KB Output isn't correct