結果

問題 No.3343 Distance Sum of Large Tree
コンテスト
ユーザー tassei903
提出日時 2025-10-25 16:49:09
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,320 bytes
コンパイル時間 10,523 ms
コンパイル使用メモリ 355,116 KB
実行使用メモリ 22,868 KB
最終ジャッジ日時 2025-11-13 20:57:10
合計ジャッジ時間 13,314 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 2
other WA * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;

struct UnionFind{
    vector<int> par;
    UnionFind(int n) : par(n, -1) {}

    int find(int x){
        if(par[x] < 0) return x;
        return par[x] = find(par[x]);
    }
    bool merge(int x, int y){
        x = find(x);
        y = find(y);
        if(x == y) return false;
        if(par[x] > par[y]) swap(x, y);
        par[x] += par[y];
        par[y] = x;
        return true;
    }

    bool same(int x, int y){
        return find(x) == find(y);
    }

};

const int N_MIN = 2, N_MAX = 100000;
const int A_MIN = 1, A_MAX = 1'000'000'000;


int main(){
    registerValidation();
    int N = inf.readInt(N_MIN, N_MAX);
    inf.readEoln();
    vector<int> A = inf.readInts(N, A_MIN, A_MAX);
    inf.readEoln();
    UnionFind uf(N);
    vector<int> b = inf.readInts(N - 1, A_MIN, A_MAX);
    inf.readEoln();
    vector<int> c = inf.readInts(N - 1, A_MIN, A_MAX);
    inf.readEoln();
    vector<int> p = inf.readInts(N - 1, 1, N);
    inf.readEoln();

    for(int i = 1; i < N; i++){
        ensure(p[i-1] <= i);
        ensure(!uf.same(i, p[i-1]-1));
        uf.merge(i, p[i-1]-1);
        ensure(b[i-1] <= A[i]);
        ensure(c[i-1] <= A[p[i-1]-1]);
    }
    inf.readEof();
    return 0;
}   
0