Submission #1194970

#TimeUsernameProblemLanguageResultExecution timeMemory
1194970vjudge2JOI tour (JOI24_joitour)C++20
20 / 100
3097 ms34076 KiB
#include "joitour.h"
#include <bits/stdc++.h>
using namespace std;

using i32 = int32_t;
#define int long long

const int maxn = 2e5 + 5;
vector<int> adj[maxn];
int n, f[maxn], cnt[maxn][3], par[maxn];

void dfs(int u, int p = -1) {
    for (int i = 0; i < 3; i++) cnt[u][i] = 0;
    cnt[u][f[u]] = 1;
    for (auto& v : adj[u]) {
        if (v == p) continue;
        par[v] = u;
        dfs(v, u);
        for (int i = 0; i < 3; i++) {
            cnt[u][i] += cnt[v][i];
        }
    }
}

void init(i32 N, std::vector<i32> F, std::vector<i32> U, std::vector<i32> V,
          i32 Q) {
    n = N;
    for (int i = 0; i < N - 1; i++) {
        adj[U[i]].push_back(V[i]);
        adj[V[i]].push_back(U[i]);
    }            // for (auto& v : adj[i]) if (v != par[i]) ans -= cnt[v][0] * cnt[v][2];

    par[0] = -1;
    for (int i = 0; i < N; i++) f[i] = F[i];
}

void change(i32 X, i32 Y) {
    f[X] = Y;
}

int num_tours() {
    dfs(0, -1);
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (f[i] == 1) {
            ans += (cnt[0][0] - cnt[i][0]) * (cnt[i][2]);
            // cout << "ans: " << ans << '\n';
            ans += (cnt[0][2] - cnt[i][2]) * (cnt[i][0]);
                        // cout << ans << '\n';


            ans += (cnt[i][0] * cnt[i][2]);
            // cout << ans << '\n';

            for (auto& v : adj[i]) if (v != par[i]) ans -= cnt[v][0] * cnt[v][2];
        }
        // cout << f[i] << " ";
    }
    // cout << '\n';
    return ans;
}
            // for (auto& v : adj[i]) if (v != par[i]) ans -= cnt[v][0] * cnt[v][2];
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...