【题解 树形dp 拆位】 树上异或

「KDOI-06-S」树上异或

题目描述

给定一棵包含 n n n 个节点的树,第 i i i 个点有一个点权 x i x_i xi

对于树上的 n − 1 n-1 n1 条边,每条边选择删除或不删除,有 2 n − 1 2^{n-1} 2n1 种选择是否删除每条边的方案。

对于每种删除边的方案,设删除后的图包含 k k k 个连通块,定义这个方案的权值为图中连通块点权异或和的乘积。形式化地说,若这张图包含连通块 C 1 , C 2 , … , C k C_1,C_2,\ldots,C_k C1,C2,,Ck,其中 C i C_i Ci 是第 i i i 个连通块的顶点集合,设 v i = ⨁ u ∈ C i x u v_i=\bigoplus_{u\in C_i} x_u vi=uCixu,则这个方案的权值为 v 1 × v 2 × ⋯ × v k v_1\times v_2\times \cdots\times v_k v1×v2××vk

求这 2 n − 1 2^{n-1} 2n1 种删除边的方案的权值之和,答案对 998 244 353 998~244~353 998 244 353 取模。

输入格式

从标准输入读入数据。

输入的第一行包含一个正整数 n n n,表示树的节点个数。

第二行 n n n 个非负整数 x 1 , x 2 , … , x n x_1,x_2,\ldots,x_n x1,x2,,xn,表示每个点的点权。

第三行 n − 1 n-1 n1 个正整数 f 2 , f 3 , … , f n f_2,f_3,\ldots,f_n f2,f3,,fn,表示节点 i i i f i f_{i} fi 之间有一条无向边。

输出格式

输出到标准输出。

输出包含一行一个整数,表示所有 2 n − 1 2^{n-1} 2n1 种删除边的方案的权值之和,答案对 998 244 353 998~244~353 998 244 353 取模。

样例 #1

样例输入 #1

3
1 2 3
1 1

样例输出 #1

19

样例 #2

样例输入 #2

5
3 4 5 6 7
1 1 2 2

样例输出 #2

5985

提示

【样例解释 #1】

有四种删除边的方案:

  • 不删除边:图有且仅有一个连通块,权值为 1 ⊕ 2 ⊕ 3 = 0 1\oplus2\oplus3=0 123=0
  • 删除 ( 1 , 2 ) (1,2) (1,2) 一条边:图包含两个连通块,权值为 ( 1 ⊕ 3 ) × 2 = 4 (1\oplus3)\times2=4 (13)×2=4
  • 删除 ( 1 , 3 ) (1,3) (1,3) 一条边:图包含两个连通块,权值为 ( 1 ⊕ 2 ) × 3 = 9 (1\oplus2)\times3=9 (12)×3=9
  • 删除 ( 1 , 2 ) (1,2) (1,2) ( 1 , 3 ) (1,3) (1,3) 两条边:图包含三个连通块,权值为 1 × 2 × 3 = 6 1\times2\times3=6 1×2×3=6

所有方案权值的总和为 0 + 4 + 9 + 6 = 19 0+4+9+6=19 0+4+9+6=19

【样例 #3】

见选手目录下的 xor/xor3.inxor/xor3.ans

这个样例满足测试点 6 ∼ 7 6\sim7 67 的条件限制。

【样例 #4】

见选手目录下的 xor/xor4.inxor/xor4.ans

这个样例满足测试点 8 8 8 的条件限制。

【样例 #5】

见选手目录下的 xor/xor5.inxor/xor5.ans

这个样例满足测试点 9 9 9 的条件限制。

【样例 #6】

见选手目录下的 xor/xor6.inxor/xor6.ans

这个样例满足测试点 19 ∼ 21 19\sim21 1921 的条件限制。


【数据范围】

对于所有数据保证: 1 ≤ n ≤ 5 × 1 0 5 1\leq n\leq5\times10^5 1n5×105 0 ≤ x i ≤ 1 0 18 0\leq x_i\leq10^{18} 0xi1018 1 ≤ f i < i 1\leq f_i<i 1fi<i

测试点编号 n ≤ n\leq n x i x_i xi特殊性质
1 ∼ 2 1\sim2 12 12 12 12 ≤ 1 0 9 \leq10^9 109
3 3 3 2000 2000 2000 = 1 =1 =1
4 4 4 1 0 5 10^5 105 = 1 =1 =1A
5 5 5 1 0 5 10^5 105 = 1 =1 =1B
6 ∼ 7 6\sim7 67 1 0 5 10^5 105 = 1 =1 =1
8 8 8 1 0 5 10^5 105 ≤ 7 \leq7 7A
9 9 9 1 0 5 10^5 105 ≤ 7 \leq7 7B
10 ∼ 11 10\sim11 1011 1 0 5 10^5 105 ≤ 7 \leq7 7
12 ∼ 16 12\sim16 1216 200 200 200 ≤ 8191 \leq8191 8191
17 17 17 1 0 5 10^5 105 ≤ 1 0 9 \leq10^9 109A
18 18 18 1 0 5 10^5 105 ≤ 1 0 9 \leq10^9 109B
19 ∼ 21 19\sim21 1921 1 0 5 10^5 105 ≤ 1 0 9 \leq10^9 109
22 ∼ 25 22\sim25 2225 5 × 1 0 5 5\times10^5 5×105 ≤ 1 0 18 \leq10^{18} 1018
  • 特殊性质 A:保证对于任意 1 < i ≤ n 1< i\le n 1<in f i = i − 1 f_i=i-1 fi=i1
  • 特殊性质 B:保证对于任意 1 < i ≤ n 1< i\le n 1<in f i = 1 f_i=1 fi=1

【提示】

⊕ \oplus 表示按位异或运算。

本题输入输出量较大,请使用适当的 I/O 方式。

请注意常数因子对程序运行效率产生的影响。


分析:

树上问题一下子不好分析,我们首先从链的问题来考虑
一一枚举所有的断边情况,时间复杂度是 O ( 2 n ) O(2^n) O(2n),显然爆炸

我们考虑dp
f i f_i fi表示第i个点的答案( ∑ ∏ \sum\prod ∑∏)
我们考虑枚举前面的断边,
f i = ∑ f j ∗ ( s i x o r s j ) f_i=\sum f_j*(s_i xor s_j) fi=fj(sixorsj)

这样 O ( n 2 ) O(n_2) O(n2)就能把问题全部解决,但是还是不够

怎么办?
我们考虑拆位
g i , j , 0 / 1 g_{i,j,0/1} gi,j,0/1表示第i个点,i所在的联通块的点权二进制的第j位为0/1时,与i所在连通块断开的连通块的答案是多少

对于当前边,我们有断和不断两个选择,如果不断,那么i的前一个点也包含在了i所在的连通块上,需要根据情况去转移对应点的01值,如果当前边断掉,那么前一个点的二进制值就当做0来考虑

于是我们进行以下转移:
在这里插入图片描述

感谢大佬的博客
而后f加起来即可


#include<bits/stdc++.h>
using namespace std;#define ll long longll Mo = 998244353;const int N = 5e5+10;
int n;
ll a[N],f[N],g[N][64][2];
struct Node{int y,Next;
}e[2*N];
int len , Linkk[N];#define gc getchar()
ll read(){ll s = 0 , ff = 0; char ch = gc;while (ch < '0' || ch > '9') ff|=ch == '-' , ch = gc;while (ch >= '0' && ch <= '9') s = s*10+ch-48 , ch = gc;return ff?-s:s;
} void Insert(int x,int y){e[++len] = (Node){y,Linkk[x]};Linkk[x] = len;
}void Dfs(int x,int faa){for (int i = 0; i < 64; i++){int xx = (a[x]>>i)&1;g[x][i][xx] = 1;}for (int j = Linkk[x]; j; j = e[j].Next){int y = e[j].y;if (y == faa) continue;Dfs(y,x);for (int i = 0; i < 64; i++){int t0 = g[x][i][0] , t1 = g[x][i][1];g[x][i][0] = (t0*((g[y][i][0]+f[y]))+t1*g[y][i][1])%Mo;g[x][i][1] = (t1*((g[y][i][0]+f[y]))+t0*g[y][i][1])%Mo;}}for (int i = 0; i < 64; i++)f[x] = (f[x]+(1ll<<i)%Mo*g[x][i][1])%Mo;return;
}signed main(){n = read();for (int i = 1; i <= n; i++) a[i] = read();for (int i = 2,x; i <= n; i++)x = read(),Insert(i,x),Insert(x,i);Dfs(1,0);printf("%lld",f[1]%Mo);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166470.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx部署vue项目(访问路径加前缀)

nginx部署vue项目(访问路径加前缀) nginx部署vue项目&#xff0c;访问路径加前缀分为两部分&#xff1a; &#xff08;1&#xff09;修改vue项目&#xff1b; &#xff08;2&#xff09;修改nginx配置&#xff1b; vue项目修改 需注意&#xff0c;我这是vue-cli3配置&#x…

npm 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

一、报错&#xff1a; npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c; 然后再试一次。 所在位置 行:1 字符: 1npm init -y~~~ CategoryInfo : ObjectNotFo…

uniapp开发h5引入第三方js(sdk)

manifest.json 应用配置 | uni-app官网 根据文档上描述需要自定义模板的场景为&#xff1a; 方法一&#xff1a; 起初以为是在原有的index.html基础上再新建一个html文件&#xff0c;在项目根目录建立一个template.h5.html&#xff08;仿照hello-uni-app项目&#xff09;&…

Linux下程序(C语言)实现对文件的复制

目标&#xff1a; 使用系统调用实现cp命令。 原理&#xff1a; 使用系统调用fopen打开文件&#xff0c;使用fgets()从文件读数据&#xff0c;使用fputs() 向文件写数据。 linux 文件 创建命令为 vi (文件名&#xff09;.c 文件源码&#xff1a; #include<stdio.h>…

【微服务保护】Sentinel 流控规则 —— 深入探索 Sentinel 的流控模式、流控效果以及对热点参数进行限流

文章目录 前言一、快速掌握 Sentinel 的使用1.1 什么是簇点链路1.2 Sentinel 的简单使用示例 二、Sentinel 流控模式2.1 直接模式2.2 关联模式2.3 链路模式 三、流控效果3.1 快速失败3.2 预热模式3.3 排队等待 四、对热点参数的流控4.1 热点规则4.2 热点规则演示 前言 微服务架…

【数据结构】八大排序

目录 1. 排序的概念及其作用 1.1 排序的概念 1.2 排序运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2 直接插入排序 2.1.3 希尔排序&#xff08;缩小增量排序&#xff09; 2.2 选择排序 2.2.1 基本思想 2.2.2 直接选择排序 2.2…

【LeetCode】144. 二叉树的前序遍历 [ 根结点 左子树 右子树 ]

题目链接 文章目录 Python3方法一&#xff1a; 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三&#xff1a; Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯ C…

基于Java的人事考勤签到管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

从头开始使用 KNN 进行 KNN 和 MNIST 手写数字识别的初学者指南

一、说明 MNIST &#xff08;“修改后的国家标准与技术研究所”&#xff09;是事实上的计算机视觉“hello world”数据集。自 1999 年发布以来&#xff0c;这个经典的手写图像数据集一直作为分类算法基准测试的基础。随着新的机器学习技术的出现&#xff0c;MNIST 仍然是研究人…

[AUTOSAR][诊断管理][$11] 复位服务

文章目录 一、简介(1) 应用场景&#xff08;2&#xff09; 请求格式&#xff08;3&#xff09; 重启类型 二、示例代码(1) 11_ecu_reset.c 一、简介 ECU复位服务就是可以此诊断指令来命令ECU执行自复位&#xff0c;复位有多种形式&#xff0c;依据子功能参数来区分&#xff08…

【JavaEE】synchronized原理 -- 多线程篇(6)

synchronized原理 1. synchronized具体采用了哪些加锁策略?2. synchronized内部实现策略(内部原理)2.1 偏向锁2.2 轻量级锁与重量级锁 3. synchronized 的其它优化策略3.1 锁消除3.2 锁的粒度 4. 总结 1. synchronized具体采用了哪些加锁策略? synchronized既是悲观锁, 也是…

Flow深入浅出系列之在ViewModels中使用Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之在ViewModels中使用Kotlin Flows Flow出现后&#xff0c;LiveData仍然可以用&#xff0c;并且…

Vue动态class

注意在自定义组件上绑定class会添加到该组件的根元素上面 1.对象语法 传入class对象v-bind:class 指令也可以与普通的 class attribute 共存可以动态修改class的值可以绑定一个计算数据来实现 1.传入class对象 <script src"./vue.js"></script><di…

【第二天】C++类和对象解析:构造函数、析构函数和拷贝构造函数的完全指南

一、类的引出概述 在c语言结构体中&#xff0c;行为和属性是分开的&#xff0c;万一调用错误&#xff0c;将会导致问题发生。c中类将数据和方法封装在一起&#xff0c;加以权限区分&#xff0c;用户只能通过公共方法 访问 私有数据。 二、封装 封装特性包含两个方面&#xff0…

【C++】-c++的类型转换

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

自然语言处理---Self Attention自注意力机制

Self-attention介绍 Self-attention是一种特殊的attention&#xff0c;是应用在transformer中最重要的结构之一。attention机制&#xff0c;它能够帮助找到子序列和全局的attention的关系&#xff0c;也就是找到权重值wi。Self-attention相对于attention的变化&#xff0c;其实…

使用vscode搭建虚拟机

首先vscode插件安装 名称: Remote - SSH ID: ms-vscode-remote.remote-ssh 说明: Open any folder on a remote machine using SSH and take advantage of VS Codes full feature set. 版本: 0.51.0 VS Marketplace 链接: https://marketplace.visualstudio.com/items?it…

黑豹程序员-架构师学习路线图-百科:MVC的演变终点SpringMVC

MVC发展史 在我们开发小型项目时&#xff0c;我们代码是混杂在一起的&#xff0c;术语称为紧耦合。 如最终写ASP、PHP。里面既包括服务器端代码&#xff0c;数据库操作的代码&#xff0c;又包括前端页面代码、HTML展现的代码、CSS美化的代码、JS交互的代码。可以看到早期编程就…

基于SSM的快递管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

proteus中仿真arduino的水位测试传感器

一、原理介绍 我们这里使用的水位传感器&#xff0c;只能说是一个小实验用途的水位传感器。我们首先上图 如上图所示&#xff0c;线没有连接&#xff0c;传感器由许5对裸露在外的铜线片作为传感部分&#xff0c;当浸入水中时这些铜线片会被水桥接。 这些被水连接起来的铜线&a…