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>
//#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace std;
//using namespace __gnu_pbds;
#define FOR(i, x, y) for(ll i=x; i<y; i++)
#define FORNEG(i, x, y) for(ll i=x; i>y; i--)
//#define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>
#define fast() ios_base::sync_with_stdio(false);cin.tie(NULL)
vector<ll> edges[100001];
ll par[100001];
ll depth[100001];
ll pos[100001];
ll ancestor[100001][20];
ll timer = 1;
ll anc(ll a, ll x){
if (depth[a] <= (1<<x)) return 1;
if (ancestor[a][x] != -2) return ancestor[a][x];
if (x==0) ancestor[a][x] = par[a];
else ancestor[a][x] = anc(anc(a,x-1),x-1);
return ancestor[a][x];
}
void dfs(ll a, ll p, ll d){
pos[a] = timer++;
depth[a] = d;
par[a] = p;
for (auto&i : edges[a]){
if (i != p) dfs(i, a, d+1);
}
}
ll lca(ll a, ll b){
if (depth[b] >= depth[a]) swap(a,b);
FORNEG(i,19,-1) if (depth[anc(a,i)] >= depth[b]) a = anc(a,i);
if (a==b) return a;
FORNEG(i,19,-1) if (anc(a, i) != anc(b, i)) a = anc(a,i), b = anc(b,i);
return par[a];
}
map<pair<ll, ll>, ll> rails;
ll rail[100001];
ll vals[100001];
void calc(ll a, ll p){
for (auto&i : edges[a]){
if (i != p){
calc(i, a);
ll c,d;
c = min(a, i);
d = max(a, i);
vals[rails[make_pair(c,d)]] += rail[i];
rail[a] += rail[i];
}
}
}
int main(){
FOR(i,0,100001) FOR(j,0,20) ancestor[i][j] = -2;
FOR(i,0,100001) rail[i] = 0, vals[i] = 0;
ll n,m,k;
cin >> n >> m >> k;
FOR(i,0,n-1){
ll a,b;
cin >> a >> b;
edges[b].push_back(a);
edges[a].push_back(b);
if (a>b) swap(a,b);
rails[make_pair(a,b)] = i+1;
}
dfs(1, -1, 0);
FOR(i,0,m){
ll a;
cin >> a;
vector<vector<ll>> temp;
FOR(i,0,a){
ll tempy; cin >> tempy;
temp.push_back({pos[tempy], tempy});
}
sort(temp.begin(), temp.end());
FOR(i,0,a-1){
rail[temp[i][1]] += 1;
rail[temp[i+1][1]] += 1;
rail[(lca(temp[i][1], temp[i+1][1]))] -= 2;
}
rail[temp[0][1]] += 1;
rail[temp[a-1][1]] += 1;
rail[(lca(temp[0][1], temp[a-1][1]))] -= 2;
}
calc(1, -1);
vector<ll> ans;
FOR(i,1,n){
if (vals[i] >= 2*k) ans.push_back(i);
}
cout << ans.size() << "\n";
for (auto&i : ans) cout << i << endl;
}
# | 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... |