제출 #597556

#제출 시각아이디문제언어결과실행 시간메모리
597556MilosMilutinovicRegions (IOI09_regions)C++14
80 / 100
8071 ms48368 KiB
/** * author: wxhtzdy * created: 16.07.2022 11:38:01 **/ #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, r, q; cin >> n >> r >> q; vector<vector<int>> g(n); vector<int> reg(n); for (int i = 0; i < n; i++) { if (i > 0) { int p; cin >> p; --p; g[p].push_back(i); } cin >> reg[i]; --reg[i]; } vector<vector<int>> ids(r); for (int i = 0; i < n; i++) { ids[reg[i]].push_back(i); } int BLOCK = 350; vector<bool> h(r); vector<int> id(r); vector<int> xs; int T = 0; for (int i = 0; i < r; i++) { if (ids[i].size() >= BLOCK) { h[i] = true; id[i] = ++T; xs.push_back(i); } } vector<vector<int>> U(T + 1, vector<int>(r)); vector<vector<int>> D(T + 1, vector<int>(r)); vector<vector<pair<int, int>>> ev(r); vector<vector<int>> my(r); vector<int> cnt(r); function<void(int)> Dfs = [&](int v) { if (h[reg[v]]) { for (int i = 0; i < r; i++) { U[id[reg[v]]][i] += cnt[i]; } } for (int i : xs) { D[id[i]][reg[v]] += cnt[i]; } cnt[reg[v]] += 1; ++T; ev[reg[v]].emplace_back(T - 1, -1); my[reg[v]].push_back(T); for (int u : g[v]) { Dfs(u); } ev[reg[v]].emplace_back(T, +1); cnt[reg[v]] -= 1; }; Dfs(0); while (q--) { int r1, r2; cin >> r1 >> r2; --r1; --r2; if (h[r1]) { cout << D[id[r1]][r2] << endl; } else if (h[r2]) { cout << U[id[r2]][r1] << endl; } else { int ptr = 0; long long ans = 0; for (int i = 0; i < (int) ev[r1].size(); i++) { while (ptr < (int) my[r2].size() && my[r2][ptr] <= ev[r1][i].first) { ptr += 1; } ans += ptr * ev[r1][i].second; } cout << ans << endl; } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

regions.cpp: In function 'int main()':
regions.cpp:36:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   36 |     if (ids[i].size() >= BLOCK) {
      |         ~~~~~~~~~~~~~~^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...