結果
| 問題 |
No.3343 Distance Sum of Large Tree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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 |
ソースコード
#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;
}