#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int range_rng(int l, int r)
{
return uniform_int_distribution<int>(l,r)(rng);
}
priority_queue<int> pqmax[200005];
priority_queue<int> pqmin[200005];
vector<int> nodes[200005];
int h[200005];
int u[200005];
int leaves[200005];
int ans;
bool ok;
void dfs(int node, int parent)
{
leaves[node]=0;
if (nodes[node].size()==1 && parent!=-1)
{
leaves[node]=1;
pqmax[node].push(h[node]);
pqmin[node].push(-h[node]);
return;
}
int min1,min2,sum;
min1=1e9;
min2=1e9;
sum=0;
for (auto x : nodes[node])
{
if (x!=parent)
{
h[x]=h[node]+1;
dfs(x,node);
leaves[node]+=leaves[x];
while (!pqmax[x].empty())
{
sum+=pqmax[x].top();
pqmax[x].pop();
}
if (-pqmin[x].top()<min1)
{
min2=min1;
min1=-pqmin[x].top();
}
else if (-pqmin[x].top()<min2)
{
min2=-pqmin[x].top();
}
while (!pqmin[x].empty())
{
pqmin[x].pop();
}
}
}
if (parent!=-1)
{
if (leaves[node]%2==0)
{
ans+=(sum-min1-min2)-(h[node]*(leaves[node]-2));
pqmin[node].push(-min1);
pqmin[node].push(-min2);
pqmax[node].push(min1);
pqmax[node].push(min2);
leaves[node]=2;
}
else
{
ans+=(sum-min1)-(h[node]*(leaves[node]-1));
pqmin[node].push(-min1);
pqmax[node].push(min1);
leaves[node]=1;
}
}
else
{
if (leaves[node]%2==0)
ans+=sum-h[node]*leaves[node];
else
ok=false;
leaves[node]=0;
}
}
signed main()
{
/*
ifstream fin("arbore.in");
ofstream fout("arbore.out");
*/
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,q,i,j,uu,v,root,d;
cin >> n >> q;
for (i=1; i<=n-1; i++)
{
cin >> uu >> v;
nodes[uu].push_back(v);
nodes[v].push_back(uu);
}
for (i=1; i<=n; i++)
{
if (nodes[i].size()!=1)
{
root=i;
break;
}
}
for (i=1;i<=q;i++)
{
cin >> d;
for (j=1;j<=d;j++)
{
cin >> u[j];
nodes[u[j]].push_back(n+j);
nodes[n+j].push_back(u[j]);
}
h[root]=0;
ok=true;
ans=0;
dfs(root,-1);
if (ok)
cout << ans << "\n";
else
cout << "-1\n";
for (j=1;j<=d;j++)
{
nodes[u[j]].pop_back();
nodes[n+j].pop_back();
}
}
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... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |