This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#pragma GCC optimize ("Ofast")
#pragma GCC target ("avx2")
/// #include "messy.h"
using namespace std;
using namespace __gnu_pbds;
using ll = long long;
using ld = long double;
using ii = pair<ll, ll>;
using ull = unsigned long long;
using vl = vector<long long>;
#define mp make_pair
#define pb push_back
#define pp pop_back
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound
#define all(x) (x).begin() , (x).end()
#define vi vector<int>
const int N = 2*100005;
const long long MOD = 1000000007;
const long double EPS = 0.000000001;
const double PI = 3.14159265358979323846;
const long long INF = 10000000000000000;
const int nx[2]={1, 0}, ny[2]={0, 1};
long long gcd(int a, int b) { return (b==0?a:gcd(b, a%b)); }
long long lcm(int a, int b) { return a*(b/gcd(a, b)); }
long long fact(int a) { return (a==1?1:a*fact(a-1)); }
template<class T> using Tree = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
int n, m, k, freq[5*100005], vis[5*100005], d[5*100005]; ii par[5*100005];
vector<ii>adj[5*100005]; bool done[5*200005];
void dfs(int v, int p = 1) {
for(auto to: adj[v]) {
int u = to.ff;
if(u == p) continue;
par[u] = {v, to.ss}; d[u] = d[v]+1;
dfs(u, v);
}
}
bool dfs0(int v, int to) {
if(v == to || v == 1) return (v == to);
if(!vis[par[v].ss]) vis[par[v].ss]=1, freq[par[v].ss]++;
if(freq[par[v].ss]==k) done[par[v].ss]=1, freq[par[v].ss]=0;
return dfs0(par[v].ff, to);
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
/// freopen("in.txt", "r", stdin);
cin >> n >> m >> k;
for(int l = 1; l < n; l++) {
int a, b; cin>>a>>b;
adj[a].pb({b, l}); adj[b].pb({a, l});
}
dfs(1); vector<int> res;
while(m--) {
int c; cin>>c; vector<int>arr;
for(int l=0;l<c;l++) {
int a; cin>>a; arr.pb(a);
}
memset(vis, 0, sizeof vis);
for(int l = 0; l < c; l++) {
for(int i = l + 1; i < c; i++ ){
int from = arr[l], to = arr[i];
if(d[from] < d[to]) swap(from, to);
if(!dfs0(from, to)) {
dfs0(to, from);
}
}
}
}
for(int l = 1; l < n; l++) {
if(done[l]) res.pb(l);
}
cout << (int)res.size() << "\n";
for(auto u: res) cout << u << " ";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |