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

news2024/11/22 21:42:57

「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 long

ll 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.coloradmin.cn/o/1119844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue中的响应式原理是如何实现的?

Vue中的响应式原理是通过使用Vue的响应式系统来实现的。这个系统依赖于JavaScript的Object.defineProperty方法&#xff0c;以及ES6的Proxy对象&#xff08;在Vue 3中&#xff09;。 下面是Vue中响应式原理的概述&#xff1a; 1&#xff1a;数据初始化&#xff1a; 在Vue组件…

【面试HOT100】链表树

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于LeetCodeHot100进行的&#xff0c;每个知识点的修正和深入主要参考…

Java面向对象(基础)--方法应用

文章目录 一、方法的重载介绍案例&#xff08;1&#xff09;案例1 练习&#xff08;1&#xff09;练习1&#xff08;2&#xff09;练习2&#xff08;3&#xff09;练习3&#xff08;4&#xff09;练习4 二、可变个数形参的方法介绍举例&#xff08;1&#xff09;举例1&#xff…

计算机组成原理 new07 真值和机器数 无符号整数 定点整数 定点小数 $\color{red}{Δ}$

文章目录 真值和机器数 无符号整数无符号整数的定义无符号整数的特征无符号整数的表示范围无符号整数的加法无符号数的减法 有符号整数(定点整数)有符号整数的定义原码原码的特点反码反码的特点补码补码的特点快速求解n位负数补码的方法为什么补码能够多表示一个范围(重点)变形…

java1.8新特性流

案例描述 今天跟着黑马程序员的视频&#xff0c;完成“瑞吉外卖”项目的菜品信息管理模块的时候&#xff0c;遇到了一个比较陌生的写法 用到了Java8的新特性 stream().map((item) -> {}).collect() List<DishDto> collect records.stream().map((item) -> {DishDt…

人工智能(5):深度学习简介

1 深度学习 —— 神经网络简介 深度学习&#xff08;Deep Learning&#xff09;&#xff08;也称为深度结构学习【Deep Structured Learning】、层次学习【Hierarchical Learning】或者是深度机器学习【Deep Machine Learning】&#xff09;是一类算法集合&#xff0c;是机器学…

MySQL表操作—存储

建表&#xff1a; mysql> create table sch( -> id int primary key, -> name varchar(50) not null, -> glass varchar(50) not null -> ); Query OK, 0 rows affected (0.01 sec) 插入数据&#xff1a; mysql> insert into sch (id,name,…

【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

一、什么是后台交互&#xff1f; 在小程序中&#xff0c;与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互&#xff0c;小程序能够获取服务器端的数据、上传用户数据、发送请求等。 小程序与后台交互可以实现数据的传输、用户认证、实时消…

Babylonjs学习笔记(一)——搭建基础场景

React typescript umi Babylonjs 搭建基础场景 yarn add --save babylonjs babylonjs-loaders 1、封装基础场景 import { Engine, Scene } from "babylonjs"; import { useEffect,useRef,FC } from "react"; import "./index.less"type Prop…

自用bat脚本,命令

redis配置环境变量后 关机脚本 redis-server --service-stop启动脚本 :: 注释 rem echo off cd /d d:\\Redis :: redis-cli :: shutdown :: exit :: netstat -ano |findstr "6639" :: taskkill /pid {pid} /F redis-server redis.windows.conf pausecmd中替代gr…

BFS专题8 中国象棋-马-无障碍

题目&#xff1a; 样例&#xff1a; 输入 3 3 2 1 输出 3 2 1 0 -1 4 3 2 1 思路&#xff1a; 单纯的BFS走一遍即可&#xff0c;只是方向坐标的移动变化&#xff0c;需要变化一下。 代码详解如下&#xff1a; #include <iostream> #include <vector> #include…

上次的那段代码后续

之前写了一篇文章&#xff0c;说是一个要修改一个代码&#xff0c;很多人评论说代码说得不清不楚&#xff0c;不过在评论说又解释了一波之后&#xff0c;大家至少对这个代码有理解了&#xff0c;至少知道这个代码是做什么事情了。 如果是你&#xff0c;会不会修改这段代码&…

数据结构初阶——时间复杂度

朋友们我们又见面了&#xff0c;今天我们来学习数据结构的时间复杂度&#xff0c;在讲数据结构之前&#xff0c;大家可能只知道我们学习的是数据结构&#xff0c;但是还是不知道数据结构的具体定义&#xff0c;其实就是在内存上的数据。然后我们就像通讯录一样对它进行增删查改…

Qt 目录操作(QDir 类)及展示系统文件实战 QFilelnfo 类介绍和获取文件属性项目实战

一、目录操作(QDir 类) QDir 类提供访问系统目录结构 QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统 Qt 使用“/”作为通用目录分隔符&#xff0c;与“/”在 URL 中用作路径分…

istio介绍(一)

1. 概念 1.1 虚拟服务 虚拟服务提供流量路由功能&#xff0c;它基于 Istio 和平台提供的基本的连通性和服务发现能力&#xff0c;让您配置如何在服务网格内将请求路由到服务 示例&#xff1a; apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:nam…

高项.项目管理经验、理念、教训

一、项目管理的一些经验 管项目重在管理&#xff0c;而不是死抠无关紧要的技术细节等等。 真正的团队一定是11>2&#xff0c;要把重心放在凝聚团队协力&#xff0c;共同完成目标上。 项目的推进永远都是不确定性的&#xff0c;真正考验项目经理的是不断出现的需求变更和状…

vue重修之路由【上】

文章目录 单页应用程序: SPA - Single Page Application路由简介Vue Reouter简介VueRouter的使用&#xff08;52&#xff09;组件的存放目录问题组件分类存放目录 路由的封装抽离 单页应用程序: SPA - Single Page Application 单页面应用(SPA): 所有功能在 一个html页面 上 单…

常用的跨域解决方案有哪些?

在 Web 开发中,跨域是指在浏览器环境下,通过 JavaScript 代码从一个域名的网页去访问另一个域名的资源。由于同源策略的限制,跨域请求通常会被浏览器阻止,为了实现跨域访问,HTML5 提供了一些机制来解决这个问题。 以下是一些常用的跨域解决方案: 1:JSONP(JSON with P…

展馆导览系统之AR互动式导航与展品语音讲解应用

一、项目背景 随着科技的进步和人们对于文化、艺术、历史等方面需求的提升&#xff0c;展馆在人们的生活中扮演着越来越重要的角色。然而&#xff0c;传统的展馆导览方式&#xff0c;如纸质导览、人工讲解等&#xff0c;已无法满足参观者的多元化需求。为了提升参观者的体验&a…

​CUDA学习笔记(六)Warp解析

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 Warp 逻辑上&#xff0c;所有thread是并行的&#xff0c;但是&#xff0c;从硬件的角度来说&#xff0c;实际上并不是所有的thread能够在同一时刻执行&#xff0c;接下来我们将解释有关wa…