Submission #1190639

#TimeUsernameProblemLanguageResultExecution timeMemory
1190639mehmetkaganTropical Garden (IOI11_garden)C++20
0 / 100
2 ms4160 KiB
#include "garden.h"
#include "gardenlib.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 150005;
int to[MAXN][2];
int dp[31][MAXN][2];
int pos[MAXN];

void count_routes(int n, int m, int p, int R[][2], int q, int G[]) {
    vector<int> g[MAXN];
    for (int i = 0; i < m; i++) {
        g[R[i][0]].push_back(R[i][1]);
        g[R[i][1]].push_back(R[i][0]);
    }

    for (int i = 0; i < n; i++) {
        sort(g[i].begin(), g[i].end());
        for (int j = 0; j < g[i].size(); j++) {
            int x = i, y = g[i][j];
            pos[x] = j;
        }
    }

    for (int i = 0; i < n; i++) {
        if (g[i].size() == 1) {
            to[i][0] = g[i][0];
            to[i][1] = g[i][0];
        } else {
            to[i][0] = g[i][0];
            to[i][1] = g[i][1];
        }
    }

    for (int i = 0; i < n; i++) {
        for (int b = 0; b < 2; b++) {
            int x = to[i][b];
            int idx = (g[x][0] == i ? 0 : 1);
            dp[0][i][b] = (to[x][idx] == p);
        }
    }

    for (int k = 1; k <= 30; k++) {
        for (int i = 0; i < n; i++) {
            for (int b = 0; b < 2; b++) {
                int x = to[i][b];
                int back = (g[x][0] == i ? 0 : 1);
                int y = to[x][back];
                dp[k][i][b] = dp[k - 1][x][back];
                to[i][b] = y;
            }
        }
    }

    for (int i = 0; i < q; i++) {
        int k = G[i];
        long long res = 0;
        for (int v = 0; v < n; v++) {
            for (int b = 0; b < (g[v].size()); b++) {
                int x = v, y = to[v][b];
                bool ok = true;
                for (int bit = 0; bit <= 30; bit++) {
                    if ((k >> bit) & 1) {
                        if (dp[bit][x][(g[x][0] == y ? 0 : 1)]) {
                            int nx = to[x][(g[x][0] == y ? 0 : 1)];
                            y = x;
                            x = nx;
                        } else {
                            ok = false;
                            break;
                        }
                    }
                }
                if (ok && x == p) res++;
            }
        }
        answer(res);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...