Submission #1189708

#TimeUsernameProblemLanguageResultExecution timeMemory
1189708n3rm1nRailway (BOI17_railway)C++17
23 / 100
1098 ms53176 KiB
#include<bits/stdc++.h>
#define endl '\n'
#define pb push_back
using namespace std;
const int maxn = 1e5 + 10;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
int n, m, k;
vector < pair < int, int > > g[maxn];

int p[maxn], depth[maxn];
void dfs0(int beg, int from)
{
    p[beg] = from;
    depth[beg] = depth[from] + 1;
    for (auto &[nb, id]: g[beg])
    {
        if(nb == from)continue;
        dfs0(nb, beg);
    }
}

int jump[maxn][20];
int moveup(int v, int x)
{
    for (int i = 0; i < 20; ++ i)
        if(x & (1 << i))v = jump[v][i];
    return v;
}
int lca(int u, int v)
{
    //cout << "getting lca " << u << " and " << v << endl;
    if(depth[u] < depth[v])swap(u, v);
    int diff = depth[u] - depth[v];
    u = moveup(u, diff);
   // cout << "* " << u << " " << v << endl;
    if(u == v)return u;
    for (int i = 19; i>= 0; -- i)
    {
        int newu = jump[u][i];
        int newv = jump[v][i];
        if(newu && newv && newv != newu)
        {
            u = newu;
            v = newv;
        }
    }
    return p[u];
}
map < int, int > st[maxn], fi[maxn];
int uni[maxn], ans[maxn];
map <int, int> dfs(int beg, int from)
{
    map < int, int > res;
    for (auto &[index, cnt]: st[beg])
        res[index] += cnt;

    for (auto &[nb, index]: g[beg])
    {
        if(nb == from)continue;
        map <int, int > mp = dfs(nb, beg);
        for (auto &[key, cnt]: mp)
            res[key] += cnt;
        ans[index] = uni[nb];
    }
    for (auto &[key, cnt]: fi[beg])
        res[key] -= cnt;
   // cout << "printing on " << beg << endl;
    for (auto &[key, cnt]: res)
    {
        if(!cnt)continue;
        uni[beg] ++;
        //cout << key << " " << cnt << endl;
    }
    return res;
}
int main()
{
    speed();

    cin >> n >> m >> k;
    for (int i = 1; i < n; ++ i)
    {
        int uu, vv;
        cin >> uu >> vv;
        g[uu].pb(make_pair(vv, i));
        g[vv].pb(make_pair(uu, i));
    }
    dfs0(1, 0);
    for (int i = 1; i <= n; ++ i)
        jump[i][0] = p[i];
    for (int j = 1; j < 20; ++ j)
    {
        for (int i = 1; i <= n; ++ i)
            jump[i][j] = jump[jump[i][j-1]][j-1];
    }
    for (int i = 1; i <= m; ++ i)
    {
        int cnt;
        cin >> cnt;
        vector < int > s;
        int last;
        cin >> last;
        s.pb(last);
        for (int j = 1; j < cnt; ++ j)
        {
            int v;
            cin >> v;
            s.pb(v);
            last = lca(last, v);
        }
        for (auto v: s)
            st[v][i] ++;
        fi[last][i] += cnt;
       // cout << "lca is "<<last << endl;
    }
    dfs(1, 0);
    vector < int > make;
    for (int i = 1; i < n; ++ i)
    {
        if(ans[i] >= k)make.pb(i);
    }
    cout << make.size() << endl;
    for (auto x: make)
        cout << x << " ";
    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...