제출 #961206

#제출 시각아이디문제언어결과실행 시간메모리
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;
}

컴파일 시 표준 에러 (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...