제출 #640365

#제출 시각아이디문제언어결과실행 시간메모리
640365MohamedFaresNebili동기화 (JOI13_synchronization)C++14
100 / 100
852 ms25292 KiB
#include <bits/stdc++.h>
///#pragma GCC optimize("O3,unroll-loops")
///#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

                    using namespace std;

                    const int LOG = 17;

                    int N, M, Q;
                    int timer, tin[100005], out[100005];
                    int res[100005], ST[400005], C[400005];
                    int P[100005][20], X[100005], Y[100005];
                    vector<int> adj[100005];
                    int state[100005];

                    void update(int v, int l, int r, int p, int val) {
                        if(l == r) {
                            ST[v] += val; return;
                        }
                        int md = (l + r) / 2;
                        if(p <= md) update(v * 2, l, md, p, val);
                        else update(v * 2 + 1, md + 1, r, p, val);
                        ST[v] = ST[v * 2] + ST[v * 2 + 1];
                    }
                    int query(int v, int l, int r, int lo, int hi) {
                        if(l > hi || r < lo) return 0;
                        if(l >= lo && r <= hi) return ST[v];
                        return query(v * 2, l, (l + r) / 2, lo, hi)
                            + query(v * 2 + 1, (l + r) / 2 + 1, r, lo, hi);
                    }

                    void dfs(int v, int p) {
                        tin[v] = timer++; P[v][0] = p;
                        for(auto u : adj[v]) {
                            if(u == p) continue;
                            dfs(u, v);
                        }
                        out[v] = timer;
                    }

                    int findSet(int v) {
                        int K = query(1, 0, N, 0, tin[v]);
                        for(int l = LOG - 1; ~l; l--)
                            if(P[v][l] != -1 && query(1, 0, N, 0, tin[P[v][l]]) == K)
                                v = P[v][l];
                        return v;
                    }

                    int32_t main() {
                        ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
                        cin >> N >> M >> Q;
                        for(int l = 1; l <= N - 1; l++) {
                            cin >> X[l] >> Y[l];
                            adj[X[l]].push_back(Y[l]);
                            adj[Y[l]].push_back(X[l]);
                        }

                        dfs(1, 1);

                        for(int l = 1; l < LOG; l++)
                            for(int i = 1; i <= N; i++)
                                P[i][l] = P[P[i][l - 1]][l - 1];

                        for(int l = 1; l <= N; l++) {
                            update(1, 0, N, tin[l], -1);
                            update(1, 0, N, out[l], 1);
                            res[l] = 1;
                        }

                        for(int l = 1; l <= M; l++) {
                            int D; cin >> D;
                            int U = X[D], V = Y[D];
                            if(P[U][0] == V) swap(U, V);

                            U = findSet(U);

                            if(state[D]) {
                                res[V] = C[V] = res[U];
                                update(1, 0, N, tin[V], -1);
                                update(1, 0, N, out[V], 1);
                            }
                            else {
                                res[U] += res[V] - C[V];
                                update(1, 0, N, tin[V], 1);
                                update(1, 0, N, out[V], -1);
                            }

                            state[D] = !state[D];
                        }

                        for(int l = 1; l <= Q; l++) {
                            int K; cin >> K;
                            cout << res[findSet(K)] << "\n";
                        }
                        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...