제출 #889538

#제출 시각아이디문제언어결과실행 시간메모리
889538zeta7532Railway (BOI17_railway)C++17
23 / 100
1042 ms14316 KiB
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
const ll mod = 998244353;
#define fi first
#define se second
#define rep(i,n) for(ll i=0;i<n;i++)
#define all(x) x.begin(),x.end()
#define faster ios::sync_with_stdio(false);cin.tie(nullptr)

vector<ll> bfs(vector<vector<ll>> G){
    ll N=G.size();
    vector<ll> dis(N,-1);
    dis[0]=0;
    queue<ll> que;
    que.push(0);
    while(!que.empty()){
        ll v=que.front();
        que.pop();
        for(ll nv:G[v]){
            if(dis[nv]!=-1) continue;
            dis[nv]=dis[v]+1;
            que.push(nv);
        }
    }
    return dis;
}

int main() {
    ll N,Q,K;
    cin >> N >> Q >> K;
    vector<vector<ll>> G(N);
    vector<ll> A(N-1),B(N-1);
    rep(i,N-1){
        cin >> A[i] >> B[i];
        A[i]--,B[i]--;
        G[A[i]].push_back(B[i]);
        G[B[i]].push_back(A[i]);
    }
    vector<ll> dis=bfs(G);
    vector<ll> par(N,-1);
    vector<ll> Eid(N,-1);
    rep(i,N-1){
        if(dis[A[i]]>dis[B[i]]) par[A[i]]=B[i],Eid[A[i]]=i;
        if(dis[B[i]]>dis[A[i]]) par[B[i]]=A[i],Eid[B[i]]=i;
    }
    vector<ll> ans(N-1,0);
    while(Q--){
        ll x;
        cin >> x;
        vector<ll> t(x);
        vector<ll> cnt(N-1,0);
        rep(i,x) cin >> t[i],t[i]--;
        rep(i,x-1){
            ll u=t[i];
            ll v=t[i+1];
            while(dis[u]>dis[v]){
                cnt[Eid[u]]++;
                u=par[u];
            }
            while(dis[v]>dis[u]){
                cnt[Eid[v]]++;
                v=par[v];
            }
            while(u!=v){
                cnt[Eid[u]]++;
                u=par[u];
                cnt[Eid[v]]++;
                v=par[v];
            }
        }
        rep(i,N-1) if(cnt[i]>0) ans[i]++;
    }
    ll ANS=0;
    rep(i,N-1) if(ans[i]>=K) ANS++;
    cout << ANS << endl;
    rep(i,N-1) if(ans[i]>=K) cout << i+1 << " ";
    cout << endl;
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...