답안 #843936

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
843936 2023-09-04T17:22:43 Z vjudge1 동기화 (JOI13_synchronization) C++17
30 / 100
8000 ms 19284 KB
#include <bits/stdc++.h>
using namespace std;

/// 123
const int MAXN = 1e5;
vector<int> adj[MAXN];
int f[MAXN];
int nxt[MAXN];
int par[MAXN];
pair<int, int> edge[MAXN];
#define time tme
int time = 1;
int last[MAXN];
int ans[MAXN];
int active[MAXN];
int tin[MAXN], out[MAXN];
int d[MAXN], rev[MAXN];

void prep(int u, int p) {
        par[u] = p;
        f[u] = 1;
        for (int& v : adj[u]) {
                if (v == p) {
                        swap(v, adj[u].back());
                        adj[u].pop_back();
                        break;
                }
        }
        for (int v : adj[u]) {
                d[v] = d[u] + 1;
                prep(v, u);
                f[u] += f[v];
                if (f[v] > f[adj[u][0]]) swap(v, adj[u][0]);
        }
}

void hld(int u) {
        rev[time] = u;
        tin[u] = time++;
        for (int v : adj[u]) {
                nxt[v] = v == adj[u][0] ? nxt[u] : v;
                hld(v);
        }
        out[u] = time;
}

template <class T>
class fenwick_t {
       public:
        vector<T> bit;
        int n;

        fenwick_t(int n = 0) : n(n) {
                bit.resize(n + 1, 0);
        }

        void Update(int pos, T val) {
                for (; pos <= n; pos += pos & -pos) {
                        bit[pos] += val;
                }
        }

        T Get(int pos) {
                T res = T(0);
                for (; pos > 0; pos -= pos & -pos) {
                        res += bit[pos];
                }
                return res;
        }

        T Get(int l, int r) {
                return Get(r) - (l ? Get(l - 1) : T(0));
        }
};

int32_t main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        int n, m, q;
        cin >> n >> m >> q;
        for (int i = 0; i < n - 1; i++) {
                int u, v;
                cin >> u >> v;
                u--, v--;
                adj[u].emplace_back(v);
                adj[v].emplace_back(u);
                edge[i] = {u, v};
        }

        prep(0, -1);
        hld(0);

        for (int i = 0; i < n - 1; i++) {
                if (d[edge[i].first] < d[edge[i].second]) {
                        swap(edge[i].first, edge[i].second);
                }
        }
        for (int i = 0; i < n; i++) ans[i] = 1;
        fenwick_t<int> fw(n);
        auto root = [&](int x) {
                while (true) {
                        if (fw.Get(tin[nxt[x]], tin[x]) != tin[x] - tin[nxt[x]] + 1) {
                                int l = tin[nxt[x]], r = tin[x], res = -1;
                                while (l <= r) {
                                        int mid = l + r >> 1;
                                        if (fw.Get(mid, tin[x]) != tin[x] - mid + 1) {
                                                res = rev[mid];
                                                l = mid + 1;
                                        } else {
                                                r = mid - 1;
                                        }
                                }
                                return assert(res != -1), res;
                        } else {
                                x = par[nxt[x]];
                        }
                }
        };

        while (m--) {
                int e;
                cin >> e;
                e--;
                auto [x, y] = edge[e];
                //   y
                //   |
                //   x
                int r = root(y);
                active[e] ^= 1;
                if (active[e]) {
                        last[e] = ans[r] = ans[r] + ans[x] - last[e];
                        fw.Update(tin[x], +1);
                } else {
                        ans[x] = last[e] = ans[r];
                        fw.Update(tin[x], -1);
                }
        }
        while (q--) {
                int u;
                cin >> u;
                u--;
                cout << ans[root(u)] << '\n';
        }
}

Compilation message

synchronization.cpp: In lambda function:
synchronization.cpp:105:53: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  105 |                                         int mid = l + r >> 1;
      |                                                   ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 5208 KB Output is correct
2 Execution timed out 8063 ms 5212 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 52 ms 14928 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 5212 KB Output is correct
2 Correct 1 ms 5212 KB Output is correct
3 Correct 1 ms 5212 KB Output is correct
4 Correct 1 ms 5212 KB Output is correct
5 Correct 1 ms 5212 KB Output is correct
6 Correct 2 ms 5212 KB Output is correct
7 Correct 16 ms 6668 KB Output is correct
8 Correct 164 ms 18840 KB Output is correct
9 Correct 154 ms 18840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 158 ms 19028 KB Output is correct
2 Correct 114 ms 19152 KB Output is correct
3 Correct 117 ms 19284 KB Output is correct
4 Correct 112 ms 19216 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 5212 KB Output is correct
2 Execution timed out 8054 ms 5212 KB Time limit exceeded
3 Halted 0 ms 0 KB -