Submission #1096666

#TimeUsernameProblemLanguageResultExecution timeMemory
1096666Top1BUCODERailway (BOI17_railway)C++17
0 / 100
51 ms29148 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair <int,int>
#define X first
#define Y second
const int N=1e5+5;
const int K=22;
int n,m,x,y,k,sz[N],h,H[N],p[N][K],t,c[N],e[N]; vector <int> g,w[N];; vector <pii> adj[N]; bool check[N];
void dfs(int u,int par)
{
    for (pii v:adj[u])
    if (v.X!=par)
    {
        H[v.X]=H[u]+1;
        p[v.X][0]=u;
        e[v.X]=v.Y;
        sz[u]+=sz[v.X];
        dfs(v.X,u);
    }
}
int lca(int a,int b)
{
    if (H[a]<H[b]) swap(a,b);
    for (int j=20;j>=0;j--)
    if (H[p[a][j]]>=H[b]) a=p[a][j];
    if (a==b) return a;
    for (int j=20;j>=0;j--)
    if (p[a][j]!=p[b][j])
    {
        a=p[a][j];
        b=p[b][j];
    }
    return p[a][0];
}
void calc(int u,int par)
{
    for (pii v:adj[u])
    if (v.X!=par)
    {
        calc(v.X,u);
        sz[u]+=sz[v.X];
        if (sz[v.X]>=k) g.push_back(v.Y);
    }
}
void lcb(int a)
{
    while (!check[a])
    {
        check[a]=true;
        g.push_back(e[a]);
        a=p[a][0];
    }
}
bool cmp(int x,int y)
{
    return H[x]>H[y];
}
int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL); cout.tie(NULL);
    cin >> n >> m >> k;
    for (int i=1;i<=n-1;i++)
    {
        cin >> x >> y;
        adj[x].push_back(make_pair(y,i));
        adj[y].push_back(make_pair(x,i));
    }
    H[1]=1;
    dfs(1,-1);
    for (int j=1;j<=20;j++)
    for (int i=1;i<=n;i++)
    p[i][j]=p[p[i][j-1]][j-1];
    for (int j=1;j<=m;j++)
    {
        cin >> y;
        for (int i=1;i<=y;i++)
        {
            cin >> x;
            w[j].push_back(x);
        }
        t=max(t,y);
    }
    if (t==2)
    {
        for (int i=1;i<=m;i++)
        if (w[i].size()==2)
        {
            sz[w[i][0]]++;
            sz[w[i][1]]++;
            sz[lca(w[i][1],w[i][0])]-=2;
        }
    }
    else
    {
        t=0;
        for (int i=1;i<=m;i++)
        for (int j:w[i])
        sz[j]++;
        for (int i=1;i<=n;i++)
        if (sz[i]>=k)
        {
            t++;
            c[t]=i;
        }
        sort(c+1,c+t+1,cmp);
        x=c[1];
        for (int i=2;i<=t;i++)
        x=lca(x,c[i]);
        check[x]=true;
        for (int i=1;i<=t;i++)
        if (!check[c[i]]) lcb(c[i]);
    }
    sort(g.begin(),g.end());
    cout << g.size() << "\n";
    for (int i:g)
    cout << i << ' ';
}
#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...