Submission #1177223

#TimeUsernameProblemLanguageResultExecution timeMemory
1177223GrayRailway (BOI17_railway)C++20
100 / 100
79 ms39364 KiB
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define ff first
#define ss second
#define ln "\n"
#define mp make_pair
#define pb push_back
#define INF (ll)2e18
#define MOD (ll)(1e9+7)
ll n, m, k;

struct edge{
    ll u, v, i;
};

vector<vector<ll>> A, bin;
vector<edge> e;
vector<ll> level, tin, pref;

void dfs1(ll u, ll p, ll clev, ll &timer){
    tin[u]=timer; timer++;
    level[u]=clev; bin[u][0]=p;
    for (ll i=1; i<20; i++) bin[u][i]=bin[bin[u][i-1]][i-1];
    for (auto i:A[u]){
        ll v = e[i].u^e[i].v^u;
        if (v!=p){
            dfs1(v, u, clev+1, timer);
        }
    }
}

ll lca(ll u, ll v){
    if (level[u]<level[v]) swap(u, v);
    ll jmp = level[u]-level[v];
    for (ll i=0; i<20; i++){
        if ((1<<i)&(jmp)) u=bin[u][i];
    }
    if (u==v) return u;
    for (ll i=19; i>=0; i--){
        if (bin[u][i]!=bin[v][i]) {
            u=bin[u][i]; v=bin[v][i];
        }
    }
    return bin[u][0];
}

void dfs3(ll u, ll p, vector<ll> &res){
    for (auto i:A[u]){
        ll v = e[i].u^e[i].v^u;
        if (v==p) continue;
        dfs3(v, u, res);
        // cout << u << " <-> " << v << ": " << pref[v] << ln;
        if (pref[v]>=k) res.push_back(e[i].i);
        pref[u]+=pref[v];
    }
}

void solve(){
    cin >> n >> m >> k;
    A.resize(n+1); e.resize(n); tin.resize(n+1);
    bin.resize(n+1, vector<ll>(21)); pref.resize(n+1);
    level.resize(n+1);
    for (ll i=1; i<=n-1; i++){
        ll u, v; cin >> u >> v; e[i] = {u, v, i};
        A[u].push_back(i); A[v].push_back(i);
    }
    ll timer=0; dfs1(1, 1, 0, timer);
    while (m--){
        ll a; cin >> a; vector<ll> vs(a);
        for (ll i=0; i<a; i++){
            cin >> vs[i];
        }
        sort(vs.begin(), vs.end(), [&](ll op1, ll op2){ return tin[op1]<tin[op2]; });
        // for (auto ch:vs) cout << tin[ch] << " ";
        // cout << ln;
        pref[vs[0]]++; pref[lca(vs[0], vs.back())]--;
        for (ll i=1; i<(ll)vs.size(); i++){
            pref[vs[i]]++; pref[lca(vs[i-1], vs[i])]--;
        }
    }
    vector<ll> res;
    dfs3(1, 1, res);
    sort(res.begin(), res.end());
    cout << res.size() << ln;
    for (auto ch:res) cout << ch << " ";
    cout << ln;
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    #ifdef LOCAL
    auto start = chrono::high_resolution_clock::now();
    #endif
    ll t=1;
    // cin >> t;
    while (t--) solve();
    #ifdef LOCAL
    auto duration = chrono::duration_cast<chrono::microseconds>(chrono::high_resolution_clock::now() - start);
    cout << setprecision(0) << fixed << "time: " << (double)duration.count()/1000.0 << " milliseconds" << endl;
    #endif
}
#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...