#include <bits/stdc++.h>
#include "joitour.h"
using namespace std;
using ll = long long;
#define int ll
const int N = 200005, B = 19;
int n;
vector<int> vec[N];
int tip[N], subInit[3][N], stot[3];
int inNod[N], ans = 0;
void dfs(int nod, int papa) {
subInit[0][nod] = subInit[1][nod] = subInit[2][nod] = 0;
inNod[nod] = 0;
for (auto i : vec[nod]) {
if (i == papa)
continue;
dfs(i, nod);
inNod[nod] += subInit[0][nod] * subInit[2][i];
inNod[nod] += subInit[2][nod] * subInit[0][i];
subInit[0][nod] += subInit[0][i];
subInit[1][nod] += subInit[1][i];
subInit[2][nod] += subInit[2][i];
}
subInit[tip[nod]][nod] ++;
inNod[nod] += subInit[0][nod] * (stot[2] - subInit[2][nod]);
inNod[nod] += subInit[2][nod] * (stot[0] - subInit[0][nod]);
}
void init(signed _N, vector<signed> F, vector<signed> U, vector<signed> V, signed Q) {
n = _N;
for (int i = 0; i < n; i ++) {
tip[i] = F[i];
stot[tip[i]] ++;
}
for (int i = 0; i < n - 1; i ++) {
vec[V[i]].push_back(U[i]);
vec[U[i]].push_back(V[i]);
}
dfs(0, -1);
for (int i = 0; i < n; i ++)
ans += (tip[i] == 1) * inNod[i];
}
void change(signed x, signed y) {
stot[tip[x]] --;
tip[x] = y;
stot[tip[x]] ++;
dfs(0, -1);
ans = 0;
for (int i = 0; i < n; i ++)
ans += (tip[i] == 1) * inNod[i];
}
int num_tours() {
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |