挂在 test 3 的第 100002 个回答上了。
求问还漏了什么?
我写的是:
同一深度的点不能超过两个。
有两个黑点儿子的仅能为 LCA。
所有黑点都是相邻的。
求 Hack/kk。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10,mod=1e9+7,V=1e9,INF=0x3f3f3f3f3f3f3f3f;
int T,n,q,a[N],Q[N],c[N],cs[N];
namespace Fast_IO
{
static char buf[1000000],*paa=buf,*pd=buf,out[10000000];int length=0;
#define getchar() paa==pd&&(pd=(paa=buf)+fread(buf,1,1000000,stdin),paa==pd)?EOF:*paa++
inline int read()
{
int x(0),t(1);char fc(getchar());
while(!isdigit(fc)){if(fc=='-') t=-1;fc=getchar();}
while(isdigit(fc)) x=(x<<1)+(x<<3)+(fc^48),fc=getchar();
return x*t;
}
inline void flush(){fwrite(out,1,length,stdout);length=0;}
inline void put(char c){if(length==9999999) flush();out[length++]=c;}
inline void put(string s){for(char c:s) put(c);}
inline void print(int x)
{
if(x<0) put('-'),x=-x;
if(x>9) print(x/10);
put(x%10+'0');
}
inline bool chk(char c) { return !(c>='a'&&c<='z'||c>='A'&&c<='Z'||c>='0'&&c<='9'); }
inline bool ck(char c) { return c!='\n'&&c!='\r'&&c!=-1&&c!=' '; }
inline void rd(char s[],int&n)
{
s[++n]=getchar();
while(chk(s[n])) s[n]=getchar();
while(ck(s[n])) s[++n]=getchar();
n--;
}
}
using namespace Fast_IO;
namespace tree_decomposition
{
int cnt;vector<int> e[N];
int fa[N],son[N],si[N],dep[N];
int top[N],id[N],dfn[N];
inline void add(int u,int v) { e[u].emplace_back(v),e[v].emplace_back(u); }
inline void dfs1(int u,int ff)
{
fa[u]=ff,si[u]=1,dep[u]=dep[ff]+1;
for(auto v:e[u])
{
if(v==ff) continue;
dfs1(v,u);
si[u]+=si[v];
if(si[son[u]]<si[v]) son[u]=v;
}
}
inline void dfs2(int u,int topf)
{
top[u]=topf,dfn[u]=++cnt,id[cnt]=u;
if(son[u]) dfs2(son[u],topf);
for(auto v:e[u])
{
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
inline int LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
}
using namespace tree_decomposition;
inline int dis(int x,int y){return dep[x]+dep[y]-2*dep[LCA(x,y)];}
signed main()
{
T=read();
while(T--)
{
n=read(),q=read();set<int>s,ss;cnt=0;int tot=0,tt=0,ans=0,gs=0,as=0;for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) e[i].clear(),son[i]=dfn[i]=id[i]=fa[i]=dep[i]=si[i]=c[i]=cs[i]=0;
for(int i=1,u,v;i<n;i++) u=read(),v=read(),add(u,v);dfs1(1,0),dfs2(1,1);auto it=s.begin();
for(int i=1;i<=n;i++) if(a[i]) a[i]=0,Q[++tt]=i;as=tt;for(int i=1;i<=q;i++) Q[++tt]=read();
for(int i=1,x,y,z,lca;i<=tt;i++)
{
x=Q[i];x=dfn[x];int f=0;
if(!a[id[x]])
{
s.insert(x),tot++,c[dep[Q[i]]]++;
if(c[dep[Q[i]]]==3) gs++;cs[fa[Q[i]]]++;
if(cs[fa[Q[i]]]==2&&a[fa[Q[i]]]) ss.insert(fa[Q[i]]);
if(cs[Q[i]]==2) ss.insert(Q[i]);
}
else
{
if(c[dep[Q[i]]]==3) gs--;
if(cs[fa[Q[i]]]==2&&a[fa[Q[i]]]) ss.erase(fa[Q[i]]);
if(cs[Q[i]]==2) ss.erase(Q[i]);
tot--;c[dep[Q[i]]]--;cs[fa[Q[i]]]--;
}
y=id[(it=s.lower_bound(x))==s.begin()?*--s.end():*--it];
z=id[(it=s.upper_bound(x))==s.end()?*s.begin():*it];
if(a[id[x]]) s.erase(x);x=id[x];int d=dis(x,y)+dis(x,z)-dis(y,z);
if(!a[x]) a[x]=1,ans+=d;else a[x]=0,ans-=d;
if(s.size()>=2)
{
lca=LCA(id[*s.begin()],id[*--s.end()]);
if(ss.size()==1&&*ss.begin()==lca||!ss.size()) f=1;
}
if(i>as){if(ans/2==tot-1&&!gs&&f||tot==1) put("YES\n");else put("No\n");}
}
}
genshin:;flush();return 0;
}