Submission #1282891

#TimeUsernameProblemLanguageResultExecution timeMemory
1282891dhuyyyyRailway (BOI17_railway)C++20
0 / 100
57 ms49072 KiB
 #include<bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;

using ll = long long;
using ii = pair<int, int>;
using aa = array<int,3>;

const int N = 1e5+5;
const ll INF = 1e18;
const int MOD = 1e9+7;

int n, q, k, u, v, timer = 0;

// RMQ
int st[18][2 * N];

// euler tour
int tin[N], tout[N], b[2 * N], id[2 * N];

// tree
vector<ii> adj[N];

// queries
int a[N * 2], pre[N];
vector <int> res;

bool inside(int u,int v){
    return tin[u] <= tin[v] && tout[v] <= tout[u];
}
bool cmp(int a,int b){
    return tin[a] < tin[b];
}
void dfs(int u,int p){
    tin[u] = ++timer;
    b[timer] = tin[u];
    id[timer] = u;
    for (ii it : adj[u]){
        if (it.fi == p) continue;
        dfs(it.fi,u);
        b[++timer] = tin[u];
    }
    tout[u] = timer;
}
void precompute_RMQ(){
    for (int i = 1; i <= timer; i++) st[0][i] = b[i];
    for (int j = 1; j <= 17; j++){
        for (int i = 1; i + (1 << j) - 1 <= timer; i++){
            st[j][i] = min(st[j - 1][i],st[j - 1][i + (1 << (j - 1))]);
        }
    }
}
int LCA(int u,int v){
    int l = tin[u];
    int r = tin[v];
    if (l > r) swap(l,r);
    int k = __lg(r - l + 1);
    return id[min(st[k][l],st[k][r - (1 << k) + 1])];
}
void solve(){
    cin >> k;
    for (int i = 1; i <= k; i++) cin >> a[i];
    sort(a+1,a+1+k,cmp);
    for (int i = 1; i < k; i++){
        a[i + k] = LCA(a[i],a[i + 1]);
    }
    k = 2 * k - 1;
    sort(a+1,a+1+k,cmp);
    k = unique(a+1,a+1+k) - a - 1;
    stack<int> st;
    st.push(a[1]);
    for (int i = 1; i <= k; i++){
        while (!inside(st.top(),a[i])){
            st.pop();
        }
        pre[a[i]]++;
        pre[st.top()]--;
        st.push(a[i]);
    }
}
void dp(int u,int p){
    for (ii it : adj[u]){
        if (it.fi == p) continue;
        dp(it.fi,u);
        if (pre[it.fi] >= k) res.push_back(it.se);
        pre[u] += pre[it.fi];
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    cin >> n >> q >> k;
    for (int i = 1; i < n; i++){
        cin >> u >> v;
        adj[u].push_back({v,i});
        adj[v].push_back({u,i});
    }
    dfs(1,0);
    precompute_RMQ();
    while (q--){
        solve();
    }
    dp(1,0);
    sort(res.begin(),res.end());
    res.erase(unique(res.begin(),res.end()),res.end());
    cout << (int)res.size() << '\n';
    for (int it : res) cout << it << ' ';
    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...