【Codeforce 746 C】Bakry and Partitioning
作者:互联网
https://codeforces.com/contest/1592/problem/C
分析
本题从“异或”的性质出发,已知一棵树若能符合题意地被分割成 i(2~k)个部分,那么它就可以被符合题意地分割成 i-2 个部分,则只需要考虑原来的树能否被符合题意地分割成 2 或 3 个部分。当 k=2 时,说明最多被分成 2 个部分,那么整棵树的异或必须是 0 ;当 k >= 2 时,说明可以被分成 2~k 个部分,如果整棵树的异或为 0,那么一定能,如果不是,那么就判断 k=3 的情况是否成立。分析得知当 k=3 时,必有一部分是原来的子树,剩下的部分至少还剩两个点可以被分割。dfs得到所有子树以及size情况并判断。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int t,n,k,u,v;
vector<int> d[100010];
LL a[100010]={0},r,value[100010]={0},size[100010]={0};
void dfs(int root,int fa)
{
if(d[root].size()==1)
{
size[root]=1,value[root]=a[root];
return;
}
for(auto x:d[root])
{
if(x!=fa)
{
dfs(x,root);
size[root]=size[x]+1;
value[root]=value[x]^a[root];
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
r=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
value[i]=0;
d[i].clear();
}
//cout<<n<<" "<<k<<endl;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
r^=a[i];
}
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
d[u].push_back(v);
d[v].push_back(u);
}
if(r==0)printf("YES\n");
else if(k>2)
{
int f=0;
dfs(1,0);
for(int i=1;i<=n;i++)
{
if(value[i]==r&&size[i]<=n-2)
{
f=1;
break;
}
}
if(f)printf("YES\n");
else printf("NO\n");
}
else printf("NO\n");
}
return 0;
}
标签:value,Partitioning,Bakry,int,dfs,Codeforce,100010,root,size 来源: https://www.cnblogs.com/tsyxxxka/p/15383206.html