Submission #411257

#TimeUsernameProblemLanguageResultExecution timeMemory
411257AugustinasJucasRegions (IOI09_regions)C++14
75 / 100
8079 ms70584 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O2") using namespace std; const int dydis = 2e5 + 10; int n, r, q; vector<int> dideli; // regionai vector<int> regs[dydis]; int tevas[dydis]; vector<int> gr[dydis]; map<pair<int, int>, long long > rem; int sm[dydis]; int val[dydis]; int kam[dydis]; int sq; int dbInd = 0; int kelint[dydis]; int enter[dydis], leave[dydis]; vector<vector<long long> > dideliuMem1, dideliuMem2; void dfs1(int v, int came){ enter[v] = dbInd++; for(auto x : gr[v]){ if(x == came) continue; dfs1(x, v); } leave[v] = dbInd; } bool isAnc(int a, int b){ return enter[a] <= enter[b] && leave[b] <= leave[a]; } void dfs(int v, int came, int kek, int prm){ // cout << "v = " << v << endl; sm[v] = val[v]; for(auto x : gr[v]){ if(x == came) continue; dfs(x, v, kek + val[v], prm); sm[v] += sm[x]; } if(!val[v]){ // cout << "rem[" << prm+1 << "][" << v+1 << "(" << kam[v]+1 << ")] += " << kek << "\n"; // cout << "rem[" << v+1 << "(" << kam[v]+1 << ")][" << prm+1 << "] += " << sm[v] << "\n" dideliuMem1[prm][kam[v]] += kek; dideliuMem2[prm][kam[v]] += sm[v]; } } void calc(int ind){ kelint[ind] = dideliuMem1.size(); dideliuMem1.push_back(vector<long long> (r, 0)); dideliuMem2.push_back(vector<long long> (r, 0)); // cout << "nuo " << ind+1 << endl; for(int i = 0; i < n; i++) sm[i] = val[i] = 0; for(auto x : regs[ind]){ val[x] = 1; } dfs(0, -1, 0, kelint[ind]); } long long f(int a, int b){ if(regs[a].size() >= sq){ int sk = kelint[a]; return dideliuMem1[sk][b]; } if(regs[b].size() >= sq){ int sk = kelint[b]; return dideliuMem2[sk][a]; } if(rem.count({a, b})) { return rem[{a, b}] ; } long long ret = 0; for(auto x : regs[a]){ for(auto y : regs[b]){ ret += isAnc(x, y); } } return rem[{a, b}] = ret; } int main(){ cin.tie(NULL); ios_base::sync_with_stdio(false); cin >> n >> r >> q; for(int i = 0; i < n; i++){ int par = -1, reg; if(i == 0) cin >> reg; else cin >> par >> reg; par--; reg--; regs[reg].push_back(i); if(par != -2){ gr[i].push_back(par); gr[par].push_back(i); } tevas[i] = par; kam[i] = reg; } dfs1(0, -1); sq = sqrt(n); for(int i = 0; i < r; i++){ if((int)regs[i].size() >= sq){ calc(i); dideli.push_back(i); } } while(q--){ int a, b; cin >> a >> b; a--; b--; cout << f(a, b) << endl; } return 0; }

Compilation message (stderr)

regions.cpp: In function 'long long int f(int, int)':
regions.cpp:59:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   59 |  if(regs[a].size() >= sq){
      |     ~~~~~~~~~~~~~~~^~~~~
regions.cpp:63:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   63 |  if(regs[b].size() >= sq){
      |     ~~~~~~~~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...