結果
| 問題 |
No.778 クリスマスツリー
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-09-05 04:17:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 66 ms / 2,000 ms |
| コード長 | 1,079 bytes |
| コンパイル時間 | 1,949 ms |
| コンパイル使用メモリ | 196,884 KB |
| 最終ジャッジ日時 | 2025-01-14 06:55:29 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for(int i=0; i<(int)(n); i++)
template <typename T>
class BIT {
vector<T> bit;
public:
BIT() {}
// manage data in [1, n]
BIT(int n) : bit(n + 1) {}
void init() {
fill(bit.begin(), bit.end(), 0);
}
// return sum in [1, i]
T sum(int i){
T s = 0;
while(i > 0){
s += bit[i];
i -= i & -i;
}
return s;
}
// return sum in [l, r]
T sum(int l, int r) {
return sum(r) - sum(l-1);
}
void add(int i, T x){
while(i < (int)bit.size()){
bit[i] += x;
i += i & -i;
}
}
};
int n;
vector<int> edges[200000+1];
long long dfs(int v, BIT<long long> &bit) {
long long ret = bit.sum(v);
bit.add(v, 1);
for (int w: edges[v]) {
ret += dfs(w, bit);
}
bit.add(v, -1);
return ret;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i < n; i++) {
int par;
cin >> par;
edges[par+1].push_back(i+1);
}
BIT<long long> bit(n);
cout << dfs(1, bit) << endl;
return 0;
}