Submission #1109428

#TimeUsernameProblemLanguageResultExecution timeMemory
1109428sanoRegions (IOI09_regions)C++14
100 / 100
6175 ms31420 KiB
#include<iostream> #include<vector> #include<queue> #include<deque> #include<string> #include<fstream> #include<algorithm> #include <iomanip> #include<map> #include <set> #include <unordered_map> #include <stack> #include <unordered_set> #include <cmath> #define ll long long #define For(i, n) for(int i = 0; i < (int)n; i++) #define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++) #define rfor(i, n) for(int i = (int)n; i >= (int)0; i--) #define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--) #define vec vector #define ff first #define ss second #define pb push_back #define shit short double #define pii pair<int, int> #define NEK 2147483640 #define mod 1000000007 #define mod2 1000000009 #define rsz resize #define prv1 43 #define prv2 47 #define D 8 using namespace std; vec<vec<int>> g; vec<int> eul1, eul2; vec<vec<int>> odp; vec<int> e; vec<vec<int>> m; int ti = 0; void DFS(int x, int pr) { eul1[x] = ti; ti++; m[e[x]].push_back(eul1[x]); for (auto i : g[x]) { if (i == pr) continue; DFS(i, x); } eul2[x] = ti - 1; return; } bool zorad(vec<int>& a, vec<int>& b) { return a.size() > b.size(); } void DFS2(int x, int pr, int k, int v = 0) { if (e[x] == k) v++; odp.back()[e[x]] += v; for (auto i : g[x]) { if (i == pr) continue; DFS2(i, x, k, v); } return; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); //ifstream cin("promote.in"); //ofstream cout("promote.out"); int n, r, q; cin >> n >> r >> q; vec<vec<int>> reg(r); g.resize(n); eul1.resize(n); eul2.resize(n); e.resize(n); cin >> e[0]; e[0]--; reg[e[0]].push_back(0); ffor(i, 1, n) { int x; cin >> x; x--; g[x].push_back(i); g[i].push_back(x); cin >> e[i]; e[i]--; reg[e[i]].push_back(i); } m.resize(r); DFS(0, -1); sort(reg.begin(), reg.end(), zorad); vec<int> s_n(r, -1); For(i, reg.size()) { if (reg[i].empty()) continue; s_n[e[reg[i][0]]] = i; } int odm = sqrt(n); vec<int> trol(r, 0); For(i, reg.size()) { if (reg[i].size() >= odm) { odp.push_back(trol); DFS2(0, -1, e[reg[i][0]]); } } For(i, m.size()) { sort(m[i].begin(), m[i].end()); } For(i, q) { int r1, r2; cin >> r1 >> r2; r1--; r2--; if (s_n[r1] == -1) { cout << 0 << endl; continue; } if (s_n[r1] >= odp.size()) { int vys = 0; for (auto i : reg[s_n[r1]]) { int q1 = lower_bound(m[r2].begin(), m[r2].end(), eul1[i]) - m[r2].begin(); int q2 = upper_bound(m[r2].begin(), m[r2].end(), eul2[i]) - m[r2].begin(); vys += q2 - q1; } cout << vys << endl; } else { cout << odp[s_n[r1]][r2] << endl; } } return 0; }

Compilation message (stderr)

regions.cpp: In function 'int main()':
regions.cpp:97:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   97 |   if (reg[i].size() >= odm) {
      |       ~~~~~~~~~~~~~~^~~~~~
regions.cpp:111:15: warning: comparison of integer expressions of different signedness: '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |   if (s_n[r1] >= odp.size()) {
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...