auto pre_dfs = [&](auto self, int now, int fa)->void {//预处理出每个点及其子树的sum_c sum_c[now] = C[now]; for (constauto& to : adj[now]) if (to != fa) { self(self, to, now); sum_c[now] += sum_c[to]; } }; pre_dfs(pre_dfs, 0, -1);
auto calc_d = [&](auto self, int now, int fa) -> void {//找到重心后,以重心为起点计算d for (constauto& to : adj[now]) if (to != fa) { d[to] = d[now] + 1; self(self, to, now); } }; calc_d(calc_d, centroid, -1);
i64 ans{}; for (constauto i : views::iota(0, N)) {ans += 1LL * d[i] * C[i];} std::cout << ans << '\n';
std::vector A(N, std::vector<int>(M)); for (auto& vec : A) for (auto& x : vec) {std::cin >> x;} std::vector f(M, std::vector(K, std::vector<bool>(KN)));//f[column位置j][具体数值A][出现在i行] = 1 表示 i 行,j 列 有出现 A for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) {f[j][A[i][j]][i] = true;}
int ans{}; for (int i = 0; i < N; i++) { std::vector<bool> g(N);//即 0 ~ N,每一行相同的数字出现次数是否为奇数(是的话或完就是1) for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) {g[i] ^= f[j][A[i][j]][i];} g[i] = 0;//自己那个答案肯定是0 ans += ranges::count(g, true);//所有结果为1的行,都是出现了奇数次 }
std::vector A(N, std::vector<int>(M)); for (auto& vec : A) for (auto& x : vec) {std::cin >> x;} std::vector f(M, std::vector(K, std::bitset<KN>()));//f[column位置j][具体数值A][出现在i行] = 1 表示 i 行,j 列 有出现 A for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) {f[j][A[i][j]].set(i);}
int ans{}; for (int i = 0; i < N; i++) { std::bitset<KN> g{};//即 0 ~ N,每一行相同的数字出现次数是否为奇数(是的话或完就是1) for (int j = 0; j < M; j++) {g ^= f[j][A[i][j]];} g.reset(i);//自己那个答案肯定是0 ans += g.count();//所有结果为1的行,都是出现了奇数次 }