提出 #72414091


ソースコード 拡げる

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MAX = 600001;
const int MAX_LOG = 30;
const int MOD = 998244353;

int P[MAX], A[MAX], B[MAX],
    parent[MAX][MAX_LOG], D[MAX], C[MAX],
    fac[MAX], inv[MAX], uf[MAX], sz[MAX];
vector<int> adj[MAX], val[MAX], arr[MAX], act[MAX];
bool chk[MAX];

int find(int X) { return X == uf[X] ? X : uf[X] = find(uf[X]); }
void uni(int X, int Y) {
    X = find(X), Y = find(Y);
    if (X == Y)
        return;
    else if (X > Y)
        swap(X, Y);
    uf[Y] = X, sz[X] += sz[Y], sz[Y] = 0;
}

int fpow(int N, int K) {
    int res = 1;
    while (K) {
        if (K & 1)
            res = res * N % MOD;
        N = N * N % MOD, K >>= 1;
    }
    return res;
}

int comb(int N, int K) {
    if (K < 0 || K > N)
        return 0;
    return fac[N] * inv[K] % MOD * inv[N - K] % MOD;
}

void dfs(int node, int par) {
    parent[node][0] = par, D[node] = D[par] + 1;
    for (int i = 1; i < MAX_LOG; i++)
        parent[node][i] = parent[parent[node][i - 1]][i - 1];

    for (int i : adj[node])
        dfs(i, node);
}

int lca(int X, int Y) {
    if (D[X] < D[Y])
        swap(X, Y);
    int diff = D[X] - D[Y];
    for (int i = 0; i < MAX_LOG; i++)
        if (diff & (1 << i))
            X = parent[X][i];

    for (int i = MAX_LOG - 1; i >= 0; i--)
        if (parent[X][i] != parent[Y][i])
            X = parent[X][i], Y = parent[Y][i];
    if (X != Y)
        X = parent[X][0];
    return X;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int N, M, ans = 1, X, Y, V, MD = 0;

    cin >> N >> M;
    for (int i = 0; i + 1 < N; i++)
        cin >> P[i];
    for (int i = 0; i < M; i++)
        cin >> A[i];
    for (int i = 0; i < M; i++)
        cin >> B[i];

    for (int i = 2; i <= N; i++)
        adj[P[i - 2]].push_back(i);

    dfs(1, 0);

    for (int i = 0; i + 1 < M; i++)
        C[i] = D[lca(B[i], B[i + 1])];

    fac[0] = 1, X = max(N, M);
    for (int i = 1; i <= X; i++)
        fac[i] = fac[i - 1] * i % MOD;
    inv[X] = fpow(fac[X], MOD - 2);
    for (int i = X - 1; i >= 0; i--)
        inv[i] = inv[i + 1] * (i + 1) % MOD;

    for (int i = 1; i <= N; i++)
        arr[D[i]].push_back(i), MD = max(D[i], MD);
    for (int i = 0; i < M; i++) {
        val[A[i]].push_back(i);
        uf[i] = i, sz[i] = 1;
    }
    for (int i = 0; i + 1 < M; i++)
        act[C[i]].push_back(i);

    // i, i + 1 swap -> max(A[i], A[i + 1]) <= C[i]

    for (int i = MD; i >= 1; i--) {
        for (int j : act[i])
            if (!chk[j] && !chk[j + 1])
                uni(j, j + 1);
        for (int j : arr[i]) {
            for (int k = 0; k < val[j].size(); k++) {
                X = k, Y = find(val[j][X]);
                while (k + 1 < val[j].size() && find(val[j][k + 1]) == Y)
                    k++;
                ans = ans * comb(sz[Y], k - X + 1) % MOD, sz[Y] -= k - X + 1;
                chk[Y] |= sz[Y] == 0;
            }
        }
    }

    cout << ans << '\n';

    return 0;
}

提出情報

提出日時
問題 E - Ascendant Descendant
ユーザ woohyun_jng
言語 C++23 (GCC 15.2.0)
得点 900
コード長 3146 Byte
結果 AC
実行時間 474 ms
メモリ 142540 KiB

コンパイルエラー

./Main.cpp: In function 'int main()':
./Main.cpp:111:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |             for (int k = 0; k < val[j].size(); k++) {
      |                             ~~^~~~~~~~~~~~~~~
./Main.cpp:113:30: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |                 while (k + 1 < val[j].size() && find(val[j][k + 1]) == Y)
      |                        ~~~~~~^~~~~~~~~~~~~~~
./Main.cpp:70:30: warning: unused variable 'V' [-Wunused-variable]
   70 |     int N, M, ans = 1, X, Y, V, MD = 0;
      |                              ^

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 900 / 900
結果
AC × 4
AC × 40
セット名 テストケース
Sample 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt
All 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt, 01-036.txt
ケース名 結果 実行時間 メモリ
00-sample-001.txt AC 11 ms 3680 KiB
00-sample-002.txt AC 11 ms 3764 KiB
00-sample-003.txt AC 11 ms 3660 KiB
00-sample-004.txt AC 11 ms 3732 KiB
01-001.txt AC 11 ms 3660 KiB
01-002.txt AC 11 ms 3936 KiB
01-003.txt AC 11 ms 3828 KiB
01-004.txt AC 11 ms 4064 KiB
01-005.txt AC 11 ms 3696 KiB
01-006.txt AC 360 ms 135828 KiB
01-007.txt AC 171 ms 96392 KiB
01-008.txt AC 250 ms 115360 KiB
01-009.txt AC 198 ms 103640 KiB
01-010.txt AC 347 ms 117160 KiB
01-011.txt AC 201 ms 103908 KiB
01-012.txt AC 400 ms 118940 KiB
01-013.txt AC 220 ms 103848 KiB
01-014.txt AC 216 ms 104272 KiB
01-015.txt AC 202 ms 104548 KiB
01-016.txt AC 347 ms 119468 KiB
01-017.txt AC 192 ms 103932 KiB
01-018.txt AC 207 ms 104260 KiB
01-019.txt AC 226 ms 104460 KiB
01-020.txt AC 349 ms 119832 KiB
01-021.txt AC 206 ms 103768 KiB
01-022.txt AC 217 ms 104136 KiB
01-023.txt AC 287 ms 118824 KiB
01-024.txt AC 199 ms 100876 KiB
01-025.txt AC 474 ms 126284 KiB
01-026.txt AC 246 ms 106144 KiB
01-027.txt AC 271 ms 109636 KiB
01-028.txt AC 318 ms 138940 KiB
01-029.txt AC 199 ms 138772 KiB
01-030.txt AC 177 ms 139136 KiB
01-031.txt AC 167 ms 140852 KiB
01-032.txt AC 167 ms 142540 KiB
01-033.txt AC 140 ms 119672 KiB
01-034.txt AC 167 ms 128004 KiB
01-035.txt AC 426 ms 126916 KiB
01-036.txt AC 387 ms 135956 KiB