Submission #961206

#TimeUsernameProblemLanguageResultExecution timeMemory
961206steveonalexRegions (IOI09_regions)C++17
100 / 100
3712 ms40508 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1LL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ll mask){return __builtin_popcountll(mask);} int ctz(ll mask){return __builtin_ctzll(mask);} int logOf(ll mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T& container, char separator = ' ', char finish = '\n'){ for(auto item: container) cout << item << separator; cout << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } #pragma GCC optimize("O3,avx2") const long N = 2e5 + 69, R = 25000; long n, rr, q; vector<long> graph[N]; vector<long> area[R], vaix[R], king[R]; long l[N], r[N]; long dfs_cnt = 0; void dfs(long u){ l[u] = r[u] = ++dfs_cnt; for(long v: graph[u]){ dfs(v); maximize(r[u], r[v]); } } ll calc1(long u, long v){ ll ans = 0; for(long i: vaix[u]) { ans += upper_bound(ALL(area[v]), r[i]) - lower_bound(ALL(area[v]), l[i]); } return ans; } bool compare(long a, long b){return l[a] < l[b];} ll calc2(long u, long v){ ll ans = 0; if (area[v].size() * 3 <= area[u].size()){ long x= 0, y = 0; for(long i: vaix[v]){ while(x < king[u].size() && king[u][x] < l[i]) x++; ans += (int)king[u].size() - x; while(y < area[u].size() && area[u][y] <= l[i]) y++; ans -= (int)area[u].size() - y; } return ans; } for(long i: vaix[v]){ long x = lower_bound(ALL(king[u]), l[i]) - king[u].begin(); ans += king[u].size() - x; long y = upper_bound(ALL(area[u]), l[i]) - area[u].begin(); ans -= area[u].size() - y; } return ans; } int main(void){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> rr >> q; long h; cin >> h; vaix[h].push_back(1); for(long i = 2; i<=n; ++i){ long p, h; cin >> p >> h; graph[p].push_back(i); vaix[h].push_back(i); } dfs(1); for(long i= 1; i<=rr; ++i){ for(long v: vaix[i]) { area[i].push_back(l[v]); king[i].push_back(r[v]); } sort(ALL(vaix[i]), compare); sort(ALL(area[i])); sort(ALL(king[i])); } map<pair<long, long>, long> mp; while(q--){ long r1, r2; cin >> r1 >> r2; if (mp.count({r1, r2})) { cout << mp[{r1, r2}] << endl; continue; } if (area[r1].size() <= area[r2].size()) { cout << (mp[{r1, r2}] = calc1(r1, r2)) << endl; } else{ cout << (mp[{r1, r2}] = calc2(r1, r2)) << endl; } } return 0; }

Compilation message (stderr)

regions.cpp:47:31: warning: bad option '-favx2' to pragma 'optimize' [-Wpragmas]
   47 | #pragma GCC optimize("O3,avx2")
      |                               ^
regions.cpp:57:16: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   57 | void dfs(long u){
      |                ^
regions.cpp:65:24: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   65 | ll calc1(long u, long v){
      |                        ^
regions.cpp:73:28: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   73 | bool compare(long a, long b){return l[a] < l[b];}
      |                            ^
regions.cpp:75:24: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   75 | ll calc2(long u, long v){
      |                        ^
regions.cpp: In function 'll calc2(long int, long int)':
regions.cpp:80:21: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |             while(x < king[u].size() && king[u][x] < l[i]) x++;
      |                   ~~^~~~~~~~~~~~~~~~
regions.cpp:82:21: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |             while(y < area[u].size() && area[u][y] <= l[i]) y++;
      |                   ~~^~~~~~~~~~~~~~~~
regions.cpp: At global scope:
regions.cpp:96:14: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   96 | int main(void){
      |              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...