Submission #1265247

#TimeUsernameProblemLanguageResultExecution timeMemory
1265247nguyenhuythachBitaro’s Party (JOI18_bitaro)C++20
0 / 100
3 ms5444 KiB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
const int nmax = 100000 + 69;
const int block = 320;
int n,m,q;
vector<int> adj[nmax];
vector<pii> savev[nmax];
int cnt[nmax];
int vst[nmax];

void input(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m >> q;
    for(int i=1;i<=m;i++){
        int u,v; cin >> u >> v;
        adj[max(u,v)].push_back(min(u,v));
    }
}

vector<pii> merge_vec(const vector<pii> &a, const vector<pii> &b){
    vector<pii> c;
    c.reserve(min((int)a.size() + (int)b.size(), block+5));
    int pta=0, ptb=0;
    while(pta < (int)a.size() && ptb < (int)b.size()){
        if(a[pta] > b[ptb]){
            if(!cnt[a[pta].second]) c.push_back(a[pta]);
            cnt[a[pta].second]++; pta++;
        } else {
            if(!cnt[b[ptb].second]) c.push_back(b[ptb]);
            cnt[b[ptb].second]++; ptb++;
        }
    }
    for(int i=pta;i<(int)a.size();++i){ if(!cnt[a[i].second]) c.push_back(a[i]); cnt[a[i].second]++; }
    for(int i=ptb;i<(int)b.size();++i){ if(!cnt[b[i].second]) c.push_back(b[i]); cnt[b[i].second]++; }
    for(auto &p: c) cnt[p.second] = 0;
    if((int)c.size() > block) c.resize(block);
    return c;
}

void pre_dfs(int u,int p){
    vst[u]=1;
    for(int v: adj[u]){
        if(v==p) continue;
        if(!vst[v]) pre_dfs(v,u);
        for(auto &pr : savev[v]) pr.first++;
        savev[u] = merge_vec(savev[u], savev[v]);
        for(auto &pr : savev[v]) pr.first--;
    }
}

void build(){
    for(int i=1;i<=n;i++) savev[i].clear(), savev[i].push_back({0,i});
    for(int i=1;i<=n;i++) vst[i]=0;
    for(int i=n;i>=1;i--) if(!vst[i]) pre_dfs(i,0);
}

int busy_ver[nmax];
int visit_ver[nmax];
int curVer = 1;
int dp_val[nmax];

void solve(){
    build();
    while(q--){
        curVer++;
        int t,y; cin >> t >> y;
        for(int i=0;i<y;i++){
            int x; cin >> x;
            busy_ver[x] = curVer;
        }
        if(y <= block){
            bool ok = false;
            for(auto &pr : savev[t]){
                int node = pr.second;
                if(busy_ver[node] != curVer){
                    cout << pr.first << '\n';
                    ok = true;
                    break;
                }
            }
            if(!ok) cout << -1 << '\n';
            continue;
        }
        // heavy query: iterative post-order DFS from t
        stack<tuple<int,int,int>> st;
        st.emplace(t, 0, 0);
        while(!st.empty()){
            auto [u, p, state] = st.top(); st.pop();
            if(state == 0){
                if(visit_ver[u] == curVer) continue;
                visit_ver[u] = curVer;
                st.emplace(u, p, 1);
                for(int v: adj[u]) if(v != p) st.emplace(v, u, 0);
            } else {
                if(busy_ver[u] == curVer){
                    dp_val[u] = -1;
                } else {
                    int best = 0;
                    for(int v: adj[u]) if(v != p){
                        int child = dp_val[v];
                        if(child == -1) continue;
                        if(child + 1 > best) best = child + 1;
                    }
                    dp_val[u] = best;
                }
            }
        }
        int out = dp_val[t];
        if(busy_ver[t] == curVer) cout << -1 << '\n';
        else cout << out << '\n';
    }
}

int main(){
    input();
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...