제출 #698354

#제출 시각아이디문제언어결과실행 시간메모리
698354pls33Regions (IOI09_regions)C++17
14 / 100
8087 ms131072 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #pragma region dalykai using p32 = pair<int, int>; using p32u = pair<uint32_t, uint32_t>; using p64 = pair<int64_t, int64_t>; using p64u = pair<uint64_t, uint64_t>; using vi16 = vector<int16_t>; using vi16u = vector<uint16_t>; using vi32 = vector<int>; using vi32u = vector<uint32_t>; using vi64 = vector<int64_t>; using vi64u = vector<uint64_t>; using vp32 = vector<p32>; using vp32u = vector<p32u>; using vp64 = vector<p64>; using vp64u = vector<p64u>; using vvi32 = vector<vi32>; using vvi32u = vector<vi32u>; using vvi64 = vector<vi64>; using vvi64u = vector<vi64u>; using vvp32 = vector<vp32>; using vvp32u = vector<vp32u>; using vvp64 = vector<vp64>; using vvp64u = vector<vp64u>; #pragma endregion using map_t = map<int, int>; void mark_heavy(int v, int p, map_t &heavy, vi32 &region, vvi32 &adj) { heavy[region[v]]++; for (auto &next : adj[v]) { if (next == p) { continue; } mark_heavy(next, v, heavy, region, adj); } } int mark_light(int v, int p, int need, vi32 &region, vvi32 &adj) { int count = region[v] == need; for (auto &next : adj[v]) { if (next == p) { continue; } count += mark_light(next, v, need, region, adj); } return count; } void find_hl(int v, int p, int bound, vi32 &size, vector<map_t> &heavy, vvp32 &light, vi32 &region, vvi32 &adj) { for (auto &next : adj[v]) { if (next == p) { continue; } find_hl(next, v, bound, size, heavy, light, region, adj); size[v] += size[next]; } if (size[v] < bound) { light[region[v]].emplace_back(v, p); return; } mark_heavy(v, p, heavy[region[v]], region, adj); } int main() { #ifndef _AAAAAAAAA ios_base::sync_with_stdio(false); cin.tie(0); #else freopen("region.in", "r", stdin); #ifndef __linux__ atexit([]() { freopen("con", "r", stdin); system("pause"); }); #endif #endif int n, r, q; cin >> n >> r >> q; vi32 region(n); vvi32 adj(n); cin >> region[0]; region[0]--; for (int i = 1; i < n; i++) { int parent; cin >> parent >> region[i]; parent--; region[i]--; adj[i].push_back(parent); adj[parent].push_back(i); } vi32 size(n, 1); vector<map_t> heavy(r); vvp32 light(r); int bound = (int)sqrt(n); find_hl(0, -1, bound, size, heavy, light, region, adj); // galimai reikia rast tik tiem regionam, kur dydis > sqrt(n)???? for (int i = 0; i < q; i++) { int a, b; cin >> a >> b; a--; b--; int count = 0; auto it = heavy[a].find(b); if (it != heavy[a].end()) { count += it->second; } for (auto &[v, p] : light[a]) { count += mark_light(v, p, b, region, adj); } cout << count << endl; } return 0; }

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

regions.cpp:8: warning: ignoring '#pragma region dalykai' [-Wunknown-pragmas]
    8 | #pragma region dalykai
      | 
regions.cpp:31: warning: ignoring '#pragma endregion ' [-Wunknown-pragmas]
   31 | #pragma endregion
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...