Submission #1106191

#TimeUsernameProblemLanguageResultExecution timeMemory
1106191PagodePaivaPrize (CEOI22_prize)C++17
0 / 100
765 ms143712 KiB
#include<bits/stdc++.h> using namespace std; const int N = 500010; const int LOGN = 20; vector <int> g[N]; int st; int ans[N]; struct Binary_lifting{ int pai[N][LOGN], val[N][LOGN], h[N]; void dfs(int v, int p){ pai[v][0] = p; val[v][0] = ans[v]; for(auto x : g[v]){ if(x == p) continue; h[x] = h[v]+1; dfs(x, v); } return; } void build(int n){ dfs(st, st); for(int bit = 1;bit < LOGN;bit++){ for(int i = 1;i <= n;i++){ pai[i][bit] = pai[pai[i][bit-1]][bit-1]; val[i][bit] = val[i][bit-1] + val[pai[i][bit-1]][bit-1]; } } return; } int query(int a, int b){ if(h[a] > h[b]) swap(a, b); int t = h[b]-h[a]; int res = 0; for(int bit=0;bit < LOGN;bit++){ if((1<<bit)&t){ res += val[b][bit]; b = pai[b][bit]; } } if(a == b) return res; for(int bit = LOGN-1;bit >= 0;bit--){ if(pai[a][bit] != pai[b][bit]){ res += val[a][bit]; res += val[b][bit]; a = pai[a][bit]; b = pai[b][bit]; } } return res+val[a][0]+val[b][0]; } } bin; int n, k,q , t; int pai[N]; vector <int> vertices; void dfs2(int v, int p){ if(v != p){ if(vertices.size() < k){ cout << "? " << v << ' ' << p << '\n'; cout << flush; int cu; } } if(vertices.size() < k) vertices.push_back(v); for(auto x : g[v]){ if(x == p) continue; dfs2(x, v); } return; } void dfs(int v, int p){ if(vertices.size()< k) vertices.push_back(v); for(auto x : g[v]){ if(x == p) continue; dfs(x, v); } return; } int main(){ cin >> n >> k >> q >> t; for(int i = 1;i <= n;i++){ cin >> pai[i]; if(pai[i] == -1)st = i; } for(int i = 1;i <= n;i++){ cin >> pai[i]; if(pai[i] == -1) continue; g[i].push_back(pai[i]); g[pai[i]].push_back(i); } dfs(st, st); for(auto x : vertices){ cout << x << ' '; } cout << '\n'; cout << flush; vertices.clear(); dfs2(st, st); cout << "!\n"; cout << flush; for(auto v : vertices){ int cu; if(pai[v] == -1) continue; cin >> ans[v] >> cu >> cu >> cu; } bin.build(n); while(q--){ int a, b; cin >> a >> b; cout << bin.query(a, b) << ' ' << bin.query(a, b) << '\n'; cout << flush; } return 0; }

Compilation message (stderr)

Main.cpp: In function 'void dfs2(int, int)':
Main.cpp:64:28: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   64 |         if(vertices.size() < k){
      |            ~~~~~~~~~~~~~~~~^~~
Main.cpp:67:17: warning: unused variable 'cu' [-Wunused-variable]
   67 |             int cu;
      |                 ^~
Main.cpp:70:24: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   70 |     if(vertices.size() < k) vertices.push_back(v);
      |        ~~~~~~~~~~~~~~~~^~~
Main.cpp: In function 'void dfs(int, int)':
Main.cpp:79:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   79 |     if(vertices.size()< k) vertices.push_back(v);
      |        ~~~~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...