제출 #1286993

#제출 시각아이디문제언어결과실행 시간메모리
1286993MasterMoonRailway (BOI17_railway)C++20
100 / 100
61 ms23500 KiB
#include <bits/stdc++.h>
using namespace std;
#define __Master_Moon__ int main()
#define ll long long
#define el "\n"
#define fi first
#define sq(x) (x)*(x)
#define se second
#define pub push_back
#define puf push_front
#define pii pair <int, int>
#define pll pair <long long, long long>
#define piii pair <int, pair <int, int>>
#define iiii pair <int, pair <int, pair <int, int>>>
#define plll pair <long long, pair <long long, long long>>
#define FOR(i, a, b) for(ll i = (a);i <=(b);i++)
#define FO(i, a, b) for(int i = (a);i >= (b);i--)
#define REP(i, n) for(int i = 0;i < (n);i++)
long const maxn = 1e5 + 50;
long const lg = 22;
int n,m,k,timer,h[maxn],p[maxn][lg],id[maxn];
int a[maxn],in[maxn];
vector<pii> g[maxn];
vector<int> ans;
bool cmp(int u,int v)
{
    return in[u] < in[v];
}
void dfs(int u,int par)
{
    h[u] = h[par] + 1;
    in[u] = ++timer;
    for(pii x : g[u])
    {
        if(x.fi != par)
        {
            id[x.fi] = x.se;
            p[x.fi][0] = u;
            dfs(x.fi,u);
        }
    }
}
void dfs2(int u,int par) 
{
    for(pii x : g[u])
    {
       if(x.fi != par)
       {
          dfs2(x.fi,u);
          a[u] += a[x.fi];
       }
    }
}
int lca(int u,int v)
{
    if(h[u] < h[v]) swap(u,v);
    int tmp = h[u] - h[v];
    FO(i,20,0)
    {
        if(tmp >= (1<<i))
        {
            tmp -= (1<<i);
            u = p[u][i];
        }
    }
    if(u == v) return u;
    FO(i,20,0)
    {
        if(p[u][i] != p[v][i])
        {
            u = p[u][i];
            v = p[v][i];
        }
    }
    return p[u][0];
}
void solve()
{ 
    cin >> n >> m >> k;
    REP(i,n-1)
    {
        int u,v;
        cin >> u >> v;
        g[u].pub({v,i});
        g[v].pub({u,i});
    }
    dfs(1,0);
    FOR(i,1,20) FOR(j,1,n) p[j][i] = p[p[j][i-1]][i-1];
    REP(i,m)
    {
        vector<int> v;
        int t;
        cin >> t;
        REP(i,t)
        {
            int tmp;
            cin >> tmp;
            v.pub(tmp);
        }
        sort(v.begin(),v.end(),cmp);
        v.pub(v[0]);
        int pre = 0;
        for(int x : v)
        {
            if(pre != 0)
            {
                a[x]++;
                a[pre]++;
                a[lca(x,pre)]-=2;
            }
            pre = x;
        }
    }
    dfs2(1,0);
    FOR(i,1,n) if(a[i]/2 >= k) ans.pub(id[i]+1);
    sort(ans.begin(),ans.end());
    cout << ans.size() << el;
    for(int x : ans) cout << x << ' ';
}  
__Master_Moon__
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    solve();
    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...