Submission #427781

# Submission time Handle Problem Language Result Execution time Memory
427781 2021-06-14T22:28:47 Z Odavey Regions (IOI09_regions) C++17
26 / 100
3076 ms 76200 KB
//
// ~oisín~ C++ Template
//

#include                <bits/stdc++.h>
#define MX_N            200005
#define mp              make_pair
#define mod7            1000000007
#define modpi           314159
#define PI              3.141592653589793238
#define pb              push_back
#define FastIO          ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define All(a)          a.begin(),a.end()
#define fi              first
#define se              second
#define ll              long long int
#define ull             unsigned long long int

int kx[8]  =            {+2, +2, -2, -2, +1, +1, -1, -1};
int ky[8]  =            {+1, -1, +1, -1, +2, -2, +2, -2};
int d9x[9] =            {+1, +1, +1, +0, +0, +0, -1, -1, -1};
int d9y[9] =            {+1, +0, -1, +1, +0, -1, +1, +0, -1};
int dx4[4] =            {+0, +0, +1, -1};
int dy4[4] =            {+1, -1, +0, +0};

ll gcd(ull a, ull b){
    return (a==0)?b:gcd(b%a,a);
}

ll lcm(ull a, ull b){
    return a*(b/gcd(a,b));
}

const long long INF = 1e18;

using namespace std;

int N, R, Q;
int H[MX_N];
int p[MX_N];
vector<int> adj[MX_N];
vector<int> r[MX_N];
vector<pair<int, bool> > ord;

void dfs(int at){
    ord.pb({at, 0});
    r[H[at]].pb((int)ord.size()-1);
    for(int to : adj[at]){
        if(p[at] == to){
            continue;
        }
        dfs(to);
    }
    ord.pb({at, 1});
    r[H[at]].pb((int)ord.size()-1);
}

map<pair<int, int>, int> cache;
//int cache[5000][5000];

int main(){
    cin >> N >> R >> Q;
    int c = sqrt(N);
//    int c = 1000000000;
    cin >> H[0];
    --H[0];
    for(int i=1;i<N;++i){
        cin >> p[i] >> H[i];
        --p[i], --H[i];
        adj[p[i]].pb(i);
    }
    dfs(0);

    for(int j=0;j<R;++j){
        if((int)r[j].size() >= c){
            for(int i=0;i<R;++i){
                if(i == j){
                    continue;
                }
                int x = 0, y = 0;
                int cur;
                if(r[i][0] < r[j][0]){
                    cur = r[i][0];
                    ++x;
                }else{
                    cur = r[j][0];
                    ++y;
                }
                int cntA = 0, cntB = 0;
                int ans = 0;
                while(true){
                    auto P = ord[cur];
                    if(H[P.fi] == i){
                        if(P.se == 0){
                            ++cntA;
                        }else{
                            --cntA;
                        }
                    }else{
                        if(P.se == 0){
                            ++cntB;
                            ans += cntA;
                        }else{
                            --cntB;
                        }
                    }
                    if(x == r[i].size() && y == r[j].size()){
                        break;
                    }else if(x == r[i].size()){
                        cur = r[j][y];
                        ++y;
                    }else if(y == r[j].size()){
                        cur = r[i][x];
                        ++x;
                    }else{
                        if(r[i][x] < r[j][y]){
                            cur = r[i][x];
                            ++x;
                        }else{
                            cur = r[j][y];
                            ++y;
                        }
                    }
                }
                cache[make_pair(i, j)] = ans;
                //cache[i][j] = ans;
            }
        }
    }

    for(int i=0;i<R;++i){
        if((int)r[i].size() >= c){
            for(int j=0;j<R;++j){
                if(i == j){
                    continue;
                }
                int x = 0, y = 0;
                int cur;
                if(r[i][0] < r[j][0]){
                    cur = r[i][0];
                    ++x;
                }else{
                    cur = r[j][0];
                    ++y;
                }
                int cntA = 0, cntB = 0;
                int ans = 0;
                while(true){
                    auto P = ord[cur];
                    if(H[P.fi] == i){
                        if(P.se == 0){
                            ++cntA;
                        }else{
                            --cntA;
                        }
                    }else{
                        if(P.se == 0){
                            ++cntB;
                            ans += cntA;
                        }else{
                            --cntB;
                        }
                    }
                    if(x == r[i].size() && y == r[j].size()){
                        break;
                    }else if(x == r[i].size()){
                        cur = r[j][y];
                        ++y;
                    }else if(y == r[j].size()){
                        cur = r[i][x];
                        ++x;
                    }else{
                        if(r[i][x] < r[j][y]){
                            cur = r[i][x];
                            ++x;
                        }else{
                            cur = r[j][y];
                            ++y;
                        }
                    }
                }
                cache[make_pair(i, j)] = ans;
//                if(i == j){
//                    continue;
//                }
//                vector<int> tmp;
//                for(auto P : r[i]){
//                    tmp.pb(P);
//                }
//                for(auto P : r[j]){
//                    tmp.pb(P);
//                }
//                sort(All(tmp));
//                int cntA = 0, cntB = 0;
//                int ans = 0;
//                for(auto ii : tmp){
//                    auto P = ord[ii];
//                    if(H[P.fi] == i){
//                        if(P.se == 0){
//                            ++cntA;
//                        }else{
//                            --cntA;
//                        }
//                    }else{
//                        if(P.se == 0){
//                            ++cntB;
//                            ans += cntA;
//                        }else{
//                            --cntB;
//                        }
//                    }
//                }
//                //cache[i][j] = ans;
//                cache[make_pair(i, j)] = ans;
            }
        }
    }

    while(Q--){
        int r1, r2;
        cin >> r1 >> r2;
        --r1, --r2;
        if((int)r[r1].size() >= c || (int)r[r2].size() >= c){
            cout << cache[make_pair(r1, r2)] << endl;
            cout.flush();
        }else{
            int x = 0, y = 0;
            int cur;
            if(r[r1][0] < r[r2][0]){
                cur = r[r1][0];
                ++x;
            }else{
                cur = r[r2][0];
                ++y;
            }
            int cntA = 0, cntB = 0;
            int ans = 0;
            while(true){
                auto P = ord[cur];
                if(H[P.fi] == r1){
                    if(P.se == 0){
                        ++cntA;
                    }else{
                        --cntA;
                    }
                }else{
                    if(P.se == 0){
                        ++cntB;
                        ans += cntA;
                    }else{
                        --cntB;
                    }
                }
                if(x == r[r1].size() && y == r[r2].size()){
                    break;
                }else if(x == r[r1].size()){
                    cur = r[r2][y];
                    ++y;
                }else if(y == r[r2].size()){
                    cur = r[r1][x];
                    ++x;
                }else{
                    if(r[r1][x] < r[r2][y]){
                        cur = r[r1][x];
                        ++x;
                    }else{
                        cur = r[r2][y];
                        ++y;
                    }
                }
            }
            cout << ans << endl;
            cout.flush();
        }
    }
}

Compilation message

regions.cpp: In function 'int main()':
regions.cpp:107:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |                     if(x == r[i].size() && y == r[j].size()){
      |                        ~~^~~~~~~~~~~~~~
regions.cpp:107:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |                     if(x == r[i].size() && y == r[j].size()){
      |                                            ~~^~~~~~~~~~~~~~
regions.cpp:109:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |                     }else if(x == r[i].size()){
      |                              ~~^~~~~~~~~~~~~~
regions.cpp:112:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |                     }else if(y == r[j].size()){
      |                              ~~^~~~~~~~~~~~~~
regions.cpp:164:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  164 |                     if(x == r[i].size() && y == r[j].size()){
      |                        ~~^~~~~~~~~~~~~~
regions.cpp:164:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  164 |                     if(x == r[i].size() && y == r[j].size()){
      |                                            ~~^~~~~~~~~~~~~~
regions.cpp:166:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  166 |                     }else if(x == r[i].size()){
      |                              ~~^~~~~~~~~~~~~~
regions.cpp:169:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  169 |                     }else if(y == r[j].size()){
      |                              ~~^~~~~~~~~~~~~~
regions.cpp:254:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  254 |                 if(x == r[r1].size() && y == r[r2].size()){
      |                    ~~^~~~~~~~~~~~~~~
regions.cpp:254:43: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  254 |                 if(x == r[r1].size() && y == r[r2].size()){
      |                                         ~~^~~~~~~~~~~~~~~
regions.cpp:256:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  256 |                 }else if(x == r[r1].size()){
      |                          ~~^~~~~~~~~~~~~~~
regions.cpp:259:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  259 |                 }else if(y == r[r2].size()){
      |                          ~~^~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Runtime error 18 ms 19456 KB Execution killed with signal 11
2 Runtime error 15 ms 19400 KB Execution killed with signal 11
3 Runtime error 15 ms 19480 KB Execution killed with signal 11
4 Correct 14 ms 9672 KB Output is correct
5 Correct 11 ms 9800 KB Output is correct
6 Runtime error 18 ms 19676 KB Execution killed with signal 11
7 Correct 55 ms 9800 KB Output is correct
8 Correct 37 ms 9928 KB Output is correct
9 Correct 89 ms 10440 KB Output is correct
10 Correct 102 ms 10440 KB Output is correct
11 Correct 250 ms 12624 KB Output is correct
12 Correct 171 ms 11484 KB Output is correct
13 Correct 377 ms 13880 KB Output is correct
14 Correct 616 ms 14028 KB Output is correct
15 Correct 824 ms 19108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1843 ms 18088 KB Output is correct
2 Correct 1432 ms 16916 KB Output is correct
3 Correct 3076 ms 22472 KB Output is correct
4 Runtime error 40 ms 23512 KB Execution killed with signal 11
5 Runtime error 47 ms 28432 KB Execution killed with signal 11
6 Runtime error 64 ms 26660 KB Execution killed with signal 11
7 Runtime error 76 ms 29120 KB Execution killed with signal 11
8 Runtime error 148 ms 44748 KB Execution killed with signal 11
9 Runtime error 191 ms 42868 KB Execution killed with signal 11
10 Runtime error 190 ms 56912 KB Execution killed with signal 11
11 Runtime error 206 ms 42024 KB Execution killed with signal 11
12 Runtime error 242 ms 45260 KB Execution killed with signal 11
13 Runtime error 193 ms 46680 KB Execution killed with signal 11
14 Runtime error 204 ms 45820 KB Execution killed with signal 11
15 Runtime error 1770 ms 58796 KB Execution killed with signal 11
16 Runtime error 212 ms 76200 KB Execution killed with signal 11
17 Runtime error 211 ms 73040 KB Execution killed with signal 11