Submission #1149486

#TimeUsernameProblemLanguageResultExecution timeMemory
1149486dostsRailway (BOI17_railway)C++20
100 / 100
69 ms40892 KiB
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3,unroll-loops")
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>

const int inf = 1e17,N = 3e5+1,MOD = 998244353,BL = 1000;

int n,m,threshold;
vi edges[N],tin(N),tout(N),dp(N);
int up[N][20];
int timer = 1;
void dfs(int node,int p) {
    tin[node] = timer++;
    up[node][0] = p;
    for (int i=1;i<20;i++) up[node][i] = up[up[node][i-1]][i-1];
    for (auto it : edges[node]) {
        if (it == p) continue;
        dfs(it,node);
    }
    tout[node] = timer-1;
} 

bool anc(int a,int b) {
    return tin[a] <= tin[b] && tin[b] <= tout[a];
}

int lca(int a,int b) {
    if (anc(a,b)) return a;
    if (anc(b,a)) return b;
    for (int i = 19;i>=0;i--) {
        if (!anc(up[a][i],b)) a = up[a][i];
    }
    return up[a][0];
}

void dfs2(int node,int p) {
    for (auto it : edges[node]) {
        if (it == p) continue;
        dfs2(it,node);
        dp[node]+=dp[it];
    }
}
void solve() { 
    cin >> n >> m >> threshold;
    vector<pii> edg(n);
    for (int i=1;i<n;i++) {
        int a,b;
        cin >> a >> b;
        edg[i] = {a,b};
        edges[a].push_back(b);
        edges[b].push_back(a);
    }
    dfs(1,1);
    vi nds;
    while (m--) {
        int k;
        cin >> k;
        for (int j = 1;j<=k;j++) {
            int x;
            cin >> x;
            nds.push_back(x);
        }
        sort(all(nds),[&](int x,int y) {return tin[x] < tin[y];});
        for (int i=0;i<k;i++) nds.push_back(lca(nds[i],nds[(i+1)%k]));
        sort(all(nds),[&](int x,int y) {return tin[x] < tin[y];});
        stack<int> stk;
        for (auto it : nds) {
            while (!stk.empty() && !anc(stk.top(),it)) stk.pop();
            if (!stk.empty()) {
                //edge between top and this
                dp[it]++;
                dp[stk.top()]--;
            }
            stk.push(it);
        }
        nds.clear();
    }
    dfs2(1,1);
    vi ans;
    for (int i=1;i<=n-1;i++) {
        if (anc(edg[i].ff,edg[i].ss)) swap(edg[i].ff,edg[i].ss);
        if (dp[edg[i].ff] >= threshold) ans.push_back(i);
    }
    cout << ans.size() << '\n';
    for (auto it : ans) cout << it << ' ';
    cout << '\n';
}

int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#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...