Submission #1292503

#TimeUsernameProblemLanguageResultExecution timeMemory
1292503AHOKASynchronization (JOI13_synchronization)C++20
100 / 100
393 ms30580 KiB
#include <bits/stdc++.h>

//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#pragma GCC optimize("O3")

using namespace std;
 
#define threesum cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false)
#define all(a) a.begin(), a.end()
#define F first
#define S second
//#define int long long
#define pii pair<int, int>
#define ppp pair<int, pii>
#define dout cout << fixed << setprecision(15)
#define mid ((l + r) / 2)
#define lc (2 * id)
#define rc (lc + 1)

const int maxn = 2e5 + 10, maxm = 3e3 + 10, oo = 1e18, lg = 31, sq = 1400, mod = 998244353;

int n, m, q, par[lg][maxn], st[maxn], ft[maxn], h[maxn], sz[maxn], up[maxn], hvy[maxn], lst[maxn], ans[maxn], tmr;

vector<int> adj[maxn];

vector<pii> e;

bool stat[maxn];

void pre_dfs(int v, int p){
    h[v] = h[p] + 1;
    par[0][v] = p;
    for (int b = 1; b < lg;b++)
        par[b][v] = par[b - 1][par[b - 1][v]];
    
    sz[v] = 1;
    for(auto u : adj[v])
        if(u ^ p){
            pre_dfs(u, v);
            sz[v] += sz[u];
            if(sz[u] > sz[hvy[v]])
                hvy[v] = u;
        }
}

void dfs(int v, int p, bool f = 0){
    if (f)
        up[v] = up[p];
    else
        up[v] = v;

    st[v] = ++tmr;

    if(hvy[v]){
        up[hvy[v]] = up[v];
        dfs(hvy[v], v, 1);
    }

    for(auto u : adj[v])
        if((u ^ p) && (u ^ hvy[v]))
            dfs(u, v);

    ft[v] = tmr + 1;
}

int fen[maxn];

void add(int i, int val){
    for (; i < maxn; i += i & -i)
        fen[i] += val;
}
 
int get(int i){
    int res = 0;
    for (; i > 0; i -= i & -i)
        res += fen[i];
    return res;
}

bool check(int v, int p, int f){
    if (up[v] != up[p])
        return 0;
    return ((get(st[v]) - get(st[p] - f)) == (h[v] - (h[p] - f)));
}

int go(int v){
    while(v){
        if (check(v, up[v], 1))
        {
            v = par[0][up[v]];
            continue;
        }

        for (int b = lg - 1; b + 1;b--)
            if(check(v, par[b][v], 0))
                v = par[b][v];

        return v;
    }
    return 1;
}

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

    pre_dfs(1, 0);
    dfs(1, 0);

    for (int i = 1; i <= n;i++)
        ans[i] = 1;

    for (int i = 0; i < n - 1; i++)
        if (st[e[i].F] < st[e[i].S])
            swap(e[i].F, e[i].S);

    add(1, 1);

    while (m--)
    {
        int i;
        cin >> i;
        auto [v, p] = e[--i];
        if (stat[i])
        {
            p = go(v);
            lst[v] = ans[v] = ans[p];
            add(st[v], -1);
        }
        else{
            add(st[v], 1);
            p = go(v);
            ans[p] += ans[v] - lst[v];
            //cout << v << " " << p << endl;
        }
        stat[i] ^= 1;
    }

    while(q--){
        int v;
        cin >> v;
        cout << ans[go(v)] << "\n";
    }
}

signed main()
{
    threesum;
    int t = 1;
    //cin >> t;
    while(t--)
        solve();
}

Compilation message (stderr)

synchronization.cpp:20:50: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   20 | const int maxn = 2e5 + 10, maxm = 3e3 + 10, oo = 1e18, lg = 31, sq = 1400, mod = 998244353;
      |                                                  ^~~~
#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...