제출 #1170383

#제출 시각아이디문제언어결과실행 시간메모리
1170383NeltRailway (BOI17_railway)C++20
100 / 100
65 ms26028 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define endl "\n"
using namespace std;
using namespace __gnu_pbds;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
template <typename T, typename key = less<T>>
using ordered_set = tree<T, null_type, key, rb_tree_tag, tree_order_statistics_node_update>;
struct SegTree
{
    ll n;
    vector<ll> st;
    SegTree(ll sz = 0)
    {
        n = sz;
        st.resize(n << 1, 0);
    }
    void set(ll i, ll val)
    {
        st[i + n - 1] = val;
    }
    void build()
    {
        for (ll i = n - 1; i >= 1; i--)
            st[i] = st[i << 1] + st[i << 1 | 1];
    }
    void modify(ll p, ll val)
    {
        for (st[p += n - 1] += val; p > 1; p >>= 1)
            st[p >> 1] = st[p] + st[p ^ 1];
    }
    ll query(ll l, ll r)
    {
        ll ans = 0;
        for (l += n - 1, r += n; l < r; l >>= 1, r >>= 1)
        {
            if (l & 1)
                ans += st[l++];
            if (r & 1)
                ans += st[--r];
        }
        return ans;
    }
};
const ll N = 1e5 + 5;
vector<pair<ll, ll>> g[N];
ll ind[N], d[N], f[N], timer = 0, cnt[N];
pair<ll, ll> reald[N];
void dfs(ll v, ll par = 0)
{
    d[v] = ++timer;
    for (auto [to, id] : g[v])
        if (to != par)
            ind[to] = id, dfs(to, v);
    f[v] = timer;
    reald[d[v]] = make_pair(f[v], v);
}
void solve()
{
    ll n, m, k;
    cin >> n >> m >> k;
    k = m - k;
    for (ll i = 1; i < n; i++)
    {
        ll a, b;
        cin >> a >> b;
        g[a].push_back(make_pair(b, i));
        g[b].push_back(make_pair(a, i));
    }
    dfs(1);
    vector<pair<ll, ll>> segs, seg1;
    while (m--)
    {
        ll sz;
        cin >> sz;
        vector<ll> v(sz);
        for (ll &i : v)
            cin >> i, i = d[i];
        sort(v.begin(), v.end());
        ll last = 0;
        for (ll i = 0; i < v.size(); i++)
        {
            if (last + 1 <= v[i] - 1)
            segs.push_back(make_pair(last + 1, v[i] - 1));
            last = v[i];
        }
        if (last + 1 <= n)
            segs.push_back(make_pair(last + 1, n));
        seg1.push_back(make_pair(v.front(), v.back()));
    }
    sort(segs.begin(), segs.end());
    sort(seg1.begin(), seg1.end(), greater());
    ll ptr = 0;
    SegTree st(n);
    for (ll i = 1; i <= n; i++)
    {
        while (ptr < segs.size() and segs[ptr].first <= i)
            st.modify(segs[ptr].second, 1), ptr++;
        cnt[reald[i].second] += st.query(reald[i].first, n);
        // for (auto [l, r] : segs) cnt[reald[i].second] += l <= i and reald[i].first <= r;
    }
    st = SegTree(n);
    ptr = 0;
    for (ll i = n; i >= 1; i--)
    {
        while (ptr < seg1.size() and seg1[ptr].first >= i)
            st.modify(seg1[ptr].second, 1), ptr++;
        cnt[reald[i].second] += st.query(1, reald[i].first);
        // for (auto [l, r] : seg1) cnt[reald[i].second] += i <= l and r <= reald[i].first;
    }
    // for (ll i = 1; i <= n; i++) cout << d[i] << " " << f[i] << endl;
    vector<ll> ans;
    for (ll i = 2; i <= n; i++)
        if (cnt[i] <= k)
            ans.push_back(ind[i]);
    sort(ans.begin(), ans.end());
    cout << ans.size() << endl;
    for (ll i : ans)
        cout << i << " ";
    cout << endl;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ll t = 1;
    // precomp();
    // cin >> t;
    for (ll cs = 1; cs <= t; cs++)
        solve();
    // cerr << "\nTime elapsed: " << clock() * 1000.0 / CLOCKS_PER_SEC << " ms\n";
}
#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...