[CF1788F] XOR, Tree, and Queries
题目描述
You are given a tree of $ n $ vertices. The vertices are numbered from $ 1 $ to $ n $ .
You will need to assign a weight to each edge. Let the weight of the $ i $ -th edge be $ a_i $ ( $ 1 \leq i \leq n-1 $ ). The weight of each edge should be an integer between $ 0 $ and $ 2^{30}-1 $ , inclusive.
You are given $ q $ conditions. Each condition consists of three integers $ u $ , $ v $ , and $ x $ . This means that the bitwise XOR of all edges on the shortest path from $ u $ to $ v $ should be $ x $ .
Find out if there exist $ a_1, a_2, \ldots, a_{n-1} $ that satisfy the given conditions. If yes, print a solution such that $ a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1} $ is the smallest. Here, $ \oplus $ denotes the bitwise XOR operation.
If there are multiple solutions such that $ a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1} $ is the smallest, print any.
输入格式
The first line contains two integers $ n $ and $ q $ ( $ 2 \le n \le 2.5 \cdot 10^5 $ , $ 0 \le q \le 2.5 \cdot 10^5 $ ).
The $ i $ -th of the following $ n-1 $ lines contains two integers $ x_i $ and $ y_i $ ( $ 1 \le x_i, y_i \le n $ , $ x_i \neq y_i $ ), meaning that the $ i $ -th edge connects vertices $ x_i $ and $ y_i $ in the tree.
It is guaranteed that the given edges form a tree.
The following $ q $ lines contain information about conditions.
Each line contains three integers $ u $ , $ v $ , $ x $ ( $ 1 \le u, v \le n $ , $ u \neq v $ , $ 0 \le x \le 2^{30}-1 $ ), meaning that the bitwise XOR of all edges on the shortest path from $ u $ to $ v $ should be $ x $ .
输出格式
If there do not exist $ a_1 $ , $ a_2 $ , ..., $ a_{n-1} $ that satisfy the given conditions, print "No".
Otherwise, print "Yes" in the first line.
Then print $ n-1 $ integers on the next line, where the $ i $ -th integer is the weight of the $ i $ -th edge. If there are multiple solutions that satisfy the given conditions, print a solution such that $ a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1} $ is the smallest.
If there are multiple solutions such that $ a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1} $ is the smallest, print any.
When printing "Yes" or "No", you can print each letter in any case (either upper or lower). For example, the strings "yEs", "yes", "Yes", and "YES" will be recognized as positive responses.
样例 #1
样例输入 #1
4 4
1 2
2 3
3 4
1 4 3
2 4 2
1 3 1
2 3 1
样例输出 #1
No
样例 #2
样例输入 #2
6 2
1 2
2 3
3 4
2 5
5 6
1 4 2
2 6 7
样例输出 #2
Yes
4 2 4 1 6
样例 #3
样例输入 #3
6 2
1 2
2 3
3 4
2 5
5 6
1 4 3
1 6 5
样例输出 #3
Yes
6 1 4 3 0
提示
For the first example, there does not exist a set of edge weights that satisfies the given conditions.
For the second example, the two given conditions are $ a_1 \oplus a_2 \oplus a_3=2 $ and $ a_4 \oplus a_5=7 $ . There can be multiple solutions, for example, $ (a_1, a_2, a_3, a_4, a_5)=(1, 2, 1, 4, 3) $ .
For the third example, the two given conditions are $ a_1 \oplus a_2 \oplus a_3=3 $ and $ a_1 \oplus a_4 \oplus a_5=5 $ . There are multiple solutions that satisfy the given conditions.
$ (a_1, a_2, a_3, a_4, a_5)=(1, 1, 3, 4, 0) $ satisfies the given conditions, but the bitwise XOR of all edge weights is $ 7 $ , which does not have the smallest $ a_1 \oplus a_2 \oplus \ldots \oplus a_{n-1} $ , so it cannot be the answer.
在树上路径的异或值有一个很巧妙的结论:设一个根,如果根节点到点 \(x\) 的异或和为 \(v_x\),那么路径 \((x,y)\) 的异或和为 \(v_x\oplus v_y\)
那么此时一个限制的意思就是 \(v_x\oplus v_y=a\),转化一下,\(v_x\oplus a=v_y\),那么此时可以通过构图的方式判定是否有解。
至于使所有点的权值异或和最小。那么考虑一个 \(v_x\) 什么时候会被算到总的点权异或和里面,当且仅当 \(x\) 在树中的度数是奇数。
那么此时要让异或和最小,可以将上面判断是否有解的图的每一个连通块钦定一个点 \(a\) 为代表,那么连通块中的每一个点的 \(v\) 值可以写为 \(v_a\oplus w\),那么如果这一个点会计算入总点权异或和,答案一定会多异或上一个 \(w\),\(v_a\) 是否会被计入也会发生改变。
然后此时如果没有一个连通块的点权会被计入答案,那就随便定 \(v_a\),不影响答案。否则可以记录所有的点的 \(w\) 异或之和为 \(s\),将一个被记入点权的 \(a\) 赋值为 \(s\),此时总异或和为0。
// LUOGU_RID: 103370522
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,q,d[N],in[N],f[N],p[N],ans,fl,a[N],b[N];
struct graph{
int hd[N],e_num;
struct edge{
int v,nxt,w;
}e[N<<1];
void add_edge(int u,int v,int w)
{
e[++e_num]=(edge){v,hd[u],w};
hd[u]=e_num;
// printf("%d %d %d\n",u,v,w);
}
}g,h;
void dfs(int x,int w,int t)
{
if(d[x]^w&&f[x])
{
puts("No");
exit(0);
}
if(!f[x])
{
d[x]=w,f[x]=t;
// printf("%d %d\n",x,f[x]);
for(int i=h.hd[x];i;i=h.e[i].nxt)
{
// printf("qzmyyds:%d\n",e[i].v);
dfs(h.e[i].v,w^h.e[i].w,t);
}
}
}
void sou(int x,int y)
{
for(int i=g.hd[x];i;i=g.e[i].nxt)
{
if(g.e[i].v^y)
sou(g.e[i].v,x);
else
b[g.e[i].w]=a[x]^a[y];
}
}
int main()
{
// memset(d,-1,sizeof(d));
scanf("%d%d",&n,&q);
for(int i=1;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
g.add_edge(u,v,i);
g.add_edge(v,u,i);
++in[u],++in[v];
}
while(q--)
{
int u,v,x;
scanf("%d%d%d",&u,&v,&x);
// printf("%d\n",x);
h.add_edge(u,v,x);
h.add_edge(v,u,x);
}
for(int i=1;i<=n;i++)
if(!f[i])
dfs(i,0,i);
// for(int i=1;i<=n;i++)
// printf("%d %d\n",f[i],d[i]);
puts("Yes");
for(int i=1;i<=n;i++)
if(in[i]&1)
p[f[i]]^=1,ans^=d[i];
// for(int i=1;i<=n;i++)
// printf("%d ",p[i]);
// puts("") ;
p[1]=0;
for(int i=2;i<=n;i++)
{
if(f[i]==i&&p[i])
p[i]=ans,ans=0;
// printf("hjhyyds:%d %d\n",d[i],p[f[i]]);
a[i]=d[i]^p[f[i]];
}
// for(int i=1;i<=n;i++)
// print
sou(1,0);
for(int i=1;i<n;i++)
printf("%d ",b[i]);
return 0;
}
[CF1788F] XOR, Tree, and Queries的更多相关文章
- [Codeforces Round #221 (Div. 1)][D. Tree and Queries]
题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...
- Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)
题目链接 Tree and Queries 题目大意 给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...
- CodeForces 375D Tree and Queries 莫队||DFS序
Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
- 「AGC035C」 Skolem XOR Tree
「AGC035C」 Skolem XOR Tree 感觉有那么一点点上道了? 首先对于一个 \(n\),若 \(n\equiv 3 \pmod 4\),我们很快能够构造出一个合法解如 \(n,n-1, ...
- codeforces 375D:Tree and Queries
Description You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. ...
- CF375D Tree and Queries
题意翻译 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. 感谢@elijahqi 提供的翻译 ...
- CodeForces 376F Tree and Queries(假·树上莫队)
You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will ass ...
- 【思维题 状压dp】APC001F - XOR Tree
可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...
- AtCoder - 3913 XOR Tree
Problem Statement You are given a tree with N vertices. The vertices are numbered 0 through N−1, and ...
随机推荐
- Badusb制作,远程别人电脑
Badusb制作 插一下U盘黑一台电脑,插了我的U盘你可就是我的脑了,(▽) 理论准备 我们要用它就应该知道他的工作原理是怎么样的,方便我们去发散思维去使用它. Badusb的原理是利用HID(Hum ...
- API接口设计规范
说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢? 下面我们 ...
- 纯干货!一文get昇腾Ascend C编程入门全部知识点
本文分享自华为云社区<昇腾Ascend C编程入门教程>,作者:昇腾CANN . 2023年5月6日,在昇腾AI开发者峰会上,华为正式发布了面向算子开发场景的昇腾Ascend C编程语言. ...
- SpringSecurity简明教程
SpringSecurity主要实现UserDetailsService来验证登录的用户信息,和Security的配置类来对登录方式和资源进行限制. 案例包含利用数据库进行登录验证.URL访问限制.自 ...
- QA|selenium在send_keys时报错dict object has no attribute ''|UI自动化测试
Q:selenium在send_keys时报错dict object has no attribute 'send_keys',如下图 增加了print(type(e1))发现确实是字典类型,怪了,按 ...
- vue3 + mark.js | 实现文字标注功能
页面效果 具体实现 新增 1.监听鼠标抬起事件,通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位置. 2.通过 选中的文字长度是否大于0或window.get ...
- 异常:no transaction is in progress
转载请注明出处: 在使用 @Scheduled 注解创建了一个定时任务,并通过定时任务不断向mysql写入数据,写入数据的方式是通过 jpa 的方式,在代码运行的过程中出现错误:no transac ...
- 【AI 模型】首个 Joy 模型诞生!!!全民生成 Joy 大片
接上一篇文章 "只要10秒,AI生成IP海报,解放双手",这次是全网第一个"共享joy模型",真的赚到了! 经过这段时间无数次的探索.试错.实验,最终积累了非常 ...
- Django admin 注册自己的路由
通过 admin.py 在 Django 后台注册自己的路由(对应自己的视图) 要在一个 app 里面的 admin.py 添加如下代码 # django2\apps\business\admin.p ...
- java泛型<? extends E>和<? super E>的区别和适用场景
<? extends E>是Upper Bound(上限)的通配符,用来限制元素类型的上限,如: List<? extends Fruit> fruits; 表示集合中的元素的 ...