Submission #1303942

#TimeUsernameProblemLanguageResultExecution timeMemory
1303942duongquanghai08Synchronization (JOI13_synchronization)C++20
30 / 100
211 ms22612 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 100005;
const int LOG = 18;

int n, m, q;
vector<pair<int, int>> edges; // Luu cac canh de truy xuat
vector<int> adj[N];
int up[N][LOG], depth[N], tin[N], tout[N], timer;
int edge_node[N]; // edge_node[i] = node con trong canh thu i
int bit[N];       // Fenwick tree quan ly so canh OFF
long long ans[N], last[N]; // ans[u]: so thong tin, last[u]: lich su
bool is_off[N];   // Trang thai canh hien tai (quan ly boi node con)

// --- Fenwick Tree ---
void update_bit(int idx, int val) {
    for (; idx <= n; idx += idx & -idx)
        bit[idx] += val;
}

int query_bit(int idx) {
    int sum = 0;
    for (; idx > 0; idx -= idx & -idx)
        sum += bit[idx];
    return sum;
}

// --- DFS & LCA Prep ---
void dfs(int u, int p) {
    tin[u] = ++timer;
    depth[u] = depth[p] + 1;
    up[u][0] = p;
    for (int i = 1; i < LOG; i++)
        up[u][i] = up[up[u][i-1]][i-1];

    for (int v : adj[u]) {
        if (v != p) dfs(v, u);
    }
    tout[u] = timer;
}

// --- Find Representative (Root of component) ---
// Tim to tien cao nhat ma duong di tu do den u toan canh BAT (ON)
int find_root(int u) {
    int current_off_cnt = query_bit(tin[u]);
    int curr = u;
    // Nhay nhi phan len tren
    for (int i = LOG - 1; i >= 0; i--) {
        int anc = up[curr][i];
        if (anc != 0 && query_bit(tin[anc]) == current_off_cnt) {
            curr = anc;
        }
    }
    return curr;
}

void Solve() {
    cin >> n >> m >> q;
    for (int i = 1; i < n; i++) {
        int u, v; cin >> u >> v;
        edges.push_back({u, v});
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    // Khoi tao cau truc cay
    dfs(1, 0);

    // Xac dinh chieu cha-con cho cac canh
    for (int i = 0; i < n - 1; i++) {
        int u = edges[i].first;
        int v = edges[i].second;
        if (depth[u] > depth[v]) swap(u, v); 
        // u la cha, v la con
        edge_node[i + 1] = v; // Canh i+1 duoc quan ly boi v
    }

    // Khoi tao ban dau
    for (int i = 1; i <= n; i++) {
        ans[i] = 1;      // Moi may co 1 thong tin
        last[i] = 0;     // Chua tung dong bo
        if (i != 1) {
            update_bit(tin[i], 1); // Danh dau canh noi len cha la OFF (1)
            is_off[i] = true;
        }
    }

    // Xu ly M truy van
    for (int j = 1; j <= m; j++) {
        int edge_idx; cin >> edge_idx;
        int v = edge_node[edge_idx]; // Node con quan ly canh nay
        int u = up[v][0];            // Node cha

        if (is_off[v]) {
            // TH1: Canh dang OFF -> Chuyen thanh ON (Noi)
            
            // 1. Tim dai dien cua nhom cha (u)
            int root_u = find_root(u);
            
            // 2. Cong thong tin moi tu v vao root_u
            // Thong tin moi = Hien tai cua v - Lich su da dong bo truoc do
            ans[root_u] += ans[v] - last[v];
            
            // 3. Cap nhat trang thai canh thanh ON (0)
            update_bit(tin[v], -1); 
            is_off[v] = false;
        } 
        else {
            // TH2: Canh dang ON -> Chuyen thanh OFF (Cat)
            
            // 1. Tim dai dien hien tai cua v (cung la dai dien cua u)
            int root_v = find_root(v);
            
            // 2. v tach ra, lay gia tri hien tai cua ca nhom ve lam cua rieng
            ans[v] = ans[root_v];
            
            // 3. Luu lai lich su de dung cho lan noi sau
            last[v] = ans[v];
            
            // 4. Cap nhat trang thai canh thanh OFF (1)
            update_bit(tin[v], 1);
            is_off[v] = true;
        }
    }

    // Tra loi Q truy van
    for (int k = 1; k <= q; k++) {
        int c; cin >> c;
        // Gia tri cua mot node chinh la gia tri cua dai dien nhom no
        cout << ans[find_root(c)] << "\n";
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    Solve();
    return 0;
}
#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...