这道题需要维护一棵树上的两种操作:
其中 n,m≤2×105,显然不能每次操作都直接把整条路径上的点取出来处理,否则最坏会退化到 O(nm),无法通过。
在一棵有 n 个节点的树上,每个节点有一个状态,只能为 0 或 1。定义 v(u,v) 为从节点 u 到节点 v 的简单路径上经过的所有节点的状态按次序组成的二进制数(以 u 为最高位,v 为最低位)所对应的十进制值对 109+7 取模的结果。
给定初始状态和 m 次操作,操作分为两种:
0 变 1,1 变 0)。你需要对于每个类型 2 操作输出答案。
数据范围:节点个数 n 和操作次数 m 均不超过 2imes105。节点编号从 1 到 n。初始状态只可能是 0 或 1。所有运算均在模 109+7 下进行。
第一行包含两个整数 n 和 m (1≤n,m≤2imes105),表示树的节点数与操作次数。 第二行包含 n 个整数 a1,…,an,其中 ai 为节点 i 的初始状态 (ai∈{0,1})。 接下来 n−1 行,每行两个整数 ui,vi (1≤ui,vi≤n),表示一条边连接节点 ui 和 vi。 接下来 m 行,每行三个整数 t,u,v (t∈{1,2}, 1≤u,v≤n),表示一次操作。t=1 为翻转操作,t=2 为查询操作。
对于每个类型 2 操作,输出一行一个整数,表示该路径的 v(u,v) 的值。
输入
3 3
1 0 1
1 2
2 3
2 1 3
1 1 3
2 1 3
输出
5
2
说明
初始状态:节点 1 为 1,节点 2 为 0,节点 3 为 1。
第一条操作查询 v(1,3):路径经过节点 1 $ o‘2‘ o$ 3,状态依次为 1,0,1,构成二进制数 1012,对应十进制 5,因此输出 5。
第二条操作翻转路径 1 到 3 上所有节点状态,原状态 1,0,1 变为 0,1,0。
第三条操作再次查询 v(1,3):路径状态变为 0,1,0,二进制 0102=2,输出 2。
输入
4 4
1 1 0 0
1 2
1 3
2 4
2 4 3
1 1 2
2 3 4
2 1 4
输出
6
0
0
说明
初始状态:节点 1=1,2=1,3=0,4=0。
查询 v(4,3):路径为 4 $ o‘2‘ o‘1‘ o$ 3,状态依次为 0,1,1,0,二进制 01102=6,输出 6。
翻转路径 1 到 2(包含节点 1 和 2),状态变为 0,0,0,0。
查询 v(3,4):路径 3 $ o‘1‘ o‘2‘ o$ 4,状态全 0,结果为 0。
查询 v(1,4):路径 1 $ o‘2‘ o$ 4,全 0,结果为 0。
输入
1 1
1
2 1 1
输出
1
说明
单节点树,节点 1 状态为 1。查询 v(1,1):路径只包含节点 1,二进制值为 12=1,模 109+7 得 1。这是一个简单的边界情况。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册