Submission #1268848

#TimeUsernameProblemLanguageResultExecution timeMemory
1268848Davdav1232Railway (BOI17_railway)C++20
0 / 100
1096 ms20928 KiB
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> vii;
typedef long long ll;

int a=1;
int k=1;
vi euler;
vector<vector<vii>> G;
vi path_to_par;

void dfs(int u, int p){
    euler.push_back(u);
    for(int i=0; i<G[u].size(); i++){
        if(G[u][i].first==p){
            path_to_par[u]=G[u][i].second;
            continue;
        }
        dfs(G[u][i].first, u);
    }
    euler.push_back(p);
}




int main() {
    int n, m, K;
    cin>>n>>m>>K;
    G.resize(n);
    path_to_par.resize(n);
    for(int i=0; i<n-1; i++){
        int c, b;
        cin>>c>>b;
        G[c-1].push_back({b-1, i+1});
        G[b-1].push_back({c-1, i+1});
    }
    
    //root from 0.
    dfs(0, 0);
    //find first and last time everything appears
    vi f(n, -1);
    vi l(n);
    for(int i=0; i<euler.size(); i++){
        if(f[euler[i]]==-1) f[euler[i]]=i;
        l[euler[i]]=i;
    }

    vvi S(m);
    for(int i=0; i<m; i++){
        int s;
        cin>>s;
        for(int j=0; j<s; j++){
            int a;
            cin>>a;
            S[i].push_back(a-1);
        }
    }
    vvi SS(m);
    for(int i=0; i<m; i++){
        for(int j=0; j<S[i].size(); j++){
            SS[i].push_back(f[S[i][j]]);
        }
        sort(SS[i].begin(), SS[i].end());
    }
    vi nodes;
    for(int i=1; i<n; i++){
        int count=0;
        for(int j=0; j<m; j++){
            if(SS[j][0]>=f[i] && SS[j][SS[j].size()-1]<=l[i]) continue;
            if(SS[j][0]>l[i] || SS[j][SS[j].size()-1]<f[i]) continue;
            int b=0, c=SS[j].size()-1;
            while(b+1<c){
                int d=(b+c)/2;
                if(SS[j][d]>=f[i]) c=d;
                else b=d;
            }
            if(SS[j][c]<=l[i]) count++;
            //find the first index with SS[j][t]>=f[i]
        }
        if(count>=K) nodes.push_back(i);
    }
    cout<<nodes.size()<<"\n";
    vi y;
    for(int i=0; i<nodes.size(); i++){
        y.push_back(path_to_par[nodes[i]]);
    }
    sort(y.begin(), y.end());
    for(int i=0; i<y.size(); i++) cout<<y[i]<<" ";
    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...