刚才 T3 的暴力:
#include<iostream>
#include<vector>
using namespace std;
int n,q,a[100010];
vector<int>v[100010];
int dep[100010],fa[100010][20];
int num[100010],cur;
void dfs(int x,int last)
{
fa[x][0]=last;
dep[x]=dep[last]+1;
for(int i=1;i<20;i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(auto y:v[x])
if(y!=last)dfs(y,x);
}
int LCA(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=19;i>=0;i--)
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=19;i>=0;i--)
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
int root=0;
for(int i=1;i<=n;i++)
if(v[i].size()==n-1)root=i;
if(root)
{
while(q--)
{
int op;
cin>>op;
if(op==1)
{
int x,y,k;
cin>>x>>y>>k;
if(x==y)a[x]^=k;
else if(x==root||y==root)a[x]^=k,a[y]^=k;
else a[x]^=k,a[y]^=k,a[root]^=k;
}
else
{
int x,y;
cin>>x>>y;
if(x==y)cout<<0;
else if(x==root||y==root)cout<<0;
else
{
if(a[x]+a[y]>a[root]&&a[x]+a[root]>a[y]&&a[y]+a[root]>a[x])
cout<<1;
else cout<<0;
}
}
}
}
else
{
dfs(1,0);
while(q--)
{
int op;
cin>>op;
if(op==1)
{
int x,y,k;
cin>>x>>y>>k;
if(x==y)
{
a[x]^=k;
continue;
}
int now=x,lca=LCA(x,y);
while(now!=lca)a[now]^=k,now=fa[now][0];
now=y;
while(now!=lca)a[now]^=k,now=fa[now][0];
a[lca]^=k;
}
else
{
int x,y;
cin>>x>>y;
int lca=LCA(x,y);
int dis=dep[x]+dep[y]-2*dep[lca];
if(dis<=10)
{
cur=0;
int now=x;
while(now!=lca)
num[++cur]=a[now],now=fa[now][0];
now=y;
while(now!=lca)
num[++cur]=a[now],now=fa[now][0];
num[++cur]=a[lca];
bool flag=0;
for(int i=1;i<=cur;i++)
for(int j=i+1;j<=cur;j++)
for(int k=j+1;k<=cur;k++)
if(num[i]+num[j]>num[k]&&num[i]+num[k]>num[j]&&num[j]+num[k]>num[i])
{
flag=1;
break;
}
cout<<flag;
}
else cout<<1;
}
}
}
return 0;
}
0 分。哪位大佬能看看 if(root) 里面菊花的情况怎么也没对,不用看后面