제출 #1189709

#제출 시각아이디문제언어결과실행 시간메모리
1189709n3rm1nRailway (BOI17_railway)C++17
100 / 100
179 ms63656 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], pindex[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);
        pindex[nb] = id;
    }
}

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];
}
set < int > st[maxn], fi[maxn];
int uni[maxn], ans[maxn];
set < int > keep[maxn];
bool cmp(int a, int b)
{
    return (keep[a].size() > keep[b].size());
}

void dfs(int beg, int from)
{
    set < int > res;


    vector < int > u;
    for (auto &[nb, index]: g[beg])
    {
        if(nb == from)continue;
        u.pb(nb);
        dfs(nb, beg);
    }
    if(u.size() > 0)
    {
        sort(u.begin(), u.end(), cmp);
        swap(res, keep[u[0]]);
        for (int i = 1; i < u.size(); ++ i)
        {
            int nb = u[i];
            for (auto key: keep[nb])
                res.insert(key);
        }


    }
    for (auto key: st[beg])
        res.insert(key);
    for (auto key: fi[beg])
        res.erase(key);

    ans[pindex[beg]] = res.size();
    swap(res, keep[beg]);
}
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].insert(i);
        fi[last].insert(i);
        // 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...