Submission #493140

#TimeUsernameProblemLanguageResultExecution timeMemory
493140flappybirdRegions (IOI09_regions)C++17
60 / 100
8074 ms131076 KiB
#include <bits/stdc++.h> #include <unordered_map> #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx,avx2,fma") using namespace std; typedef int ll; typedef pair<ll, ll> pll; #define MAX 200010 #define MAXS 20 #define INF 1000000000000000001 #define bb ' ' #define ln '\n' #define Ln '\n' #define B 200 vector<ll> adj[MAX]; vector<ll> rr[MAX]; pll range[MAX]; ll rrr[MAX]; ll cnt = 0; ll num[MAX]; vector<vector<ll>> tdp, bdp; void dfs(ll x, ll p = 0) { range[x].first = range[x].second = ++cnt; tdp[x] = tdp[p]; if (num[rrr[x]] != -1) tdp[x][num[rrr[x]]]++, bdp[x][num[rrr[x]]]++; for (auto v : adj[x]) { if (v == p) continue; dfs(v, x); range[x].second = max(range[x].second, range[v].second); for (ll i = 0; i < bdp[x].size(); i++) bdp[x][i] += bdp[v][i]; } } signed main() { ios::sync_with_stdio(false), cin.tie(0); ll N, R, Q; cin >> N >> R >> Q; ll i; ll p, r; cin >> r; rr[r].push_back(1); rrr[1] = r; for (i = 2; i <= N; i++) { cin >> p >> r; rrr[i] = r; adj[p].push_back(i); adj[i].push_back(p); rr[r].push_back(i); } ll nn = 0; for (i = 0; i <= R; i++) { if (rr[i].size() >= B) num[i] = nn++; else num[i] = -1; } tdp = vector<vector<ll>>(N + 2, vector<ll>(nn)); bdp = vector<vector<ll>>(N + 2, vector<ll>(nn)); ll a, b; unordered_map<ll, bool> chk; unordered_map<ll, long long> val; dfs(1); for (i = 1; i <= Q; i++) { cin >> a >> b; if (chk[a * 25001 + b]) cout << val[a * 25001 + b] << endl; else { long long ans = 0; if (rr[a].size() < rr[b].size()) { if (num[b] != -1) { for (auto x : rr[a]) ans += bdp[x][num[b]]; } else { for (auto x : rr[a]) { for (auto y : rr[b]) { if (range[x].first <= range[y].first && range[y].second <= range[x].second) ans++; } } } } else { if (num[a] != -1) { for (auto x : rr[b]) ans += tdp[x][num[a]]; } else { for (auto x : rr[a]) { for (auto y : rr[b]) { if (range[x].first <= range[y].first && range[y].second <= range[x].second) ans++; } } } } chk[a * 25001 + b] = 1; val[a * 25001 + b] = ans; cout << ans << endl; } } }

Compilation message (stderr)

regions.cpp: In function 'void dfs(ll, ll)':
regions.cpp:32:20: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |   for (ll i = 0; i < bdp[x].size(); i++) bdp[x][i] += bdp[v][i];
      |                  ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...