衢州集训Day-4

T-3

```cpp

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
#define N 500000
#define M 1000000
const int Log=20;
int head[N+5],nex[M+5],ver[M+5],tot;
inline void add(int x,int y){
ver[++tot]=y;nex[tot]=head[x];head[x]=tot;
}
int L[N+5],R[N+5],dfn[N+5],val,f[N+5],d[N+5];
int g[N+5][Log+5];
inline void dfs(int x){
f[x]=1;L[x]=dfn[x]=++val;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];if(y==g[x][0]) continue;
g[y][0]=x;d[y]=d[x]+1;
for(int i=1;i<=Log;++i){g[y][i]=g[g[y][i-1]][i-1];if(g[y][i]==0) break;}
dfs(y);f[x]+=f[y];
}R[x]=val;
}
int k,a[M+5];
inline int Lca(int x,int y){
// cout<<x<<" "<<y<<" ";
if(d[x]<d[y]) swap(x,y);
for(int i=Log;i>=0;--i){if(d[g[x][i]]>=d[y]) x=g[x][i];}
// cout<<x<<" "<<y<<" ";
if(x==y) return y;
for(int i=Log;i>=0;--i){if(g[x][i]!=g[y][i]) x=g[x][i],y=g[y][i];}
// cout<<x<<" "<<y<<endl;
return g[x][0];
}
inline int get(int x,int res){
for(int i=Log;i>=0;--i){if(res>=(1<<i)) res-=(1<<i),x=g[x][i];}
return x;
}
struct data{
int x,f,i;
};
bool jd[M+5],ok[M+5];
int n,q,mid[M+5],use[2][N+5];
bool cmp(data x,data y){
return x.x<y.x;
}
inline void work(int ii)
{
vector<data> vec;
int down=1,up=N+5,ans=n;
for(int i=2;i<=k;++i){ ok[i]=1;
int lca=Lca(a[1],a[i]);
int dis=d[a[1]]+d[a[i]]-d[lca]*2;
if(2*(d[a[1]]-d[lca])<=dis){
jd[i]=1;
mid[i]=get(a[i],(dis-1)/2);
// cout<<a[1]<<" "<<a[i]<<" "<<mid[i]<<endl;
if(L[mid[i]]+1<=R[mid[i]]) vec.push_back(data{L[mid[i]]+1,1,i}),vec.push_back(data{R[mid[i]],-1,i});
}
else{
jd[i]=0;
mid[i]=get(a[1],(dis)/2);
down=max(down,L[mid[i]]);up=min(up,R[mid[i]]);
// mid[i]=get(a[i],(dis-1)/2);
// cout<<a[1]<<" "<<a[i]<<" "<<mid[i]<<" "<<up<<" "<<down<<endl;
}
}
sort(vec.begin(),vec.end(),cmp);
int l=0,r=0,sum=0;
while(r<vec.size())
{
while(vec[r].x==vec[r+1].x&&r<vec.size()){if(sum!=0&&vec[r].f==1)ok[vec[r].i]=0;++r;}
if(sum!=0&&vec[r].f==1)ok[vec[r].i]=0;
++r;
while(l!=r) sum+=vec[l++].f;
// sum+=vec[l].f;
}
for(int i=2;i<=k;++i){
int t=dfn[mid[i]];
if(t>=down&&t<=up&&ok[i]&&use[jd[i]][mid[i]]!=ii){
// cout<<use[jd[i]][mid[i]];
use[jd[i]][mid[i]]=ii;
if(jd[i]) ans-=f[mid[i]];
else ans-=(n-f[mid[i]]);
}
}
printf("%d\n",ans);
}
int main()
{
// freopen("c.in","r",stdin);
// freopen("c.out","w",stdout);
n=read();q=read();
for(int i=1;i<n;++i){
int x=read(),y=read(); add(x,y);add(y,x);
}
d[1]=1;
dfs(1);
// cout<<Lca(4,6)<<endl;
for(int i=1;i<=q;++i){
k=read();for(int j=1;j<=k;++j) a[j]=read();
work(i);
}
}

```pp

posted @ 2019-02-16 15:55  Cseller  阅读(130)  评论(0编辑  收藏  举报