树形dp记录路径 CF1779F Xorcerer’s Stones

CF1779F Xorcerer’s Stones
树形dp记录路径
首先我们分析一下操作。
对于奇树,进行一次操作后,其异或和不变;对于偶树,进行一次操作后,其异或和为0。
如果我们能让所有点异或和为0,只要在根节点再进行一次操作,就可以得到一种合法操作方案,考虑树形dp出是否存在一种方案, d p u , j dp_{u,j} dpu,j表示以 u u u为根节点的子树内,是否存在异或和为 j j j的操作方案。合并很简单,但是对于 s z u sz_u szu为偶数时,不论其子树内操作如何,都可以进行一次操作,使得 d p u , 0 = 1 dp_{u,0}=1 dpu,0=1
对于方案的记录,我们开一个 p r e v , j x o r k = j pre_{v,jxork}=j prev,jxork=j,表示 d p u , j x o r k = 1 dp_{u,jxork}=1 dpu,jxork=1这种方案是在儿子异或和为 k k k的情况下,根节点异或和为 j j j的情况下合并转移而来的,因为dp时 u u u的儿子由前往后遍历转移,那么输出路径时就应该由后往前遍历

#include <bits/stdc++.h>
#define ll long long
struct node{int x,y;
};
void solve(){int n;std::cin>>n;std::vector<int> a(n+1);for (int i=1;i<=n;i++){std::cin>>a[i];}std::vector<std::vector<int>> e(n+1);for (int i=2;i<=n;i++){int x;std::cin>>x;e[x].push_back(i);e[i].push_back(x);}std::vector<int> sz(n+1);std::vector<std::vector<int>> dp(n+1,std::vector<int>(32)),pre(n+1,std::vector<int>(32));std::function<void(int,int)> dfs=[&](int u,int fa){sz[u]=1;dp[u][a[u]]=1;for (auto v:e[u]){if (v==fa) continue;dfs(v,u);std::vector<int> use(32);std::swap(dp[u],use);for (int j=0;j<32;j++){if (!use[j]) continue;for (int k=0;k<32;k++){if (!dp[v][k]) continue;dp[u][j^k]=1;pre[v][j^k]=j;}}sz[u]+=sz[v];}if (!(sz[u]&1)){dp[u][0]=1;}};dfs(1,-1);std::vector<int> ans;std::function<void(int,int,int)> prin=[&](int u,int fa,int sum){if (!(sz[u]&1)&&!sum){ans.push_back(u);}reverse(e[u].begin(),e[u].end());for (auto v:e[u]){if (v==fa) continue;prin(v,u,sum^pre[v][sum]);sum=pre[v][sum];}};if (dp[1][0]){prin(1,-1,0);std::cout<<ans.size()+1<<"\n";for (auto i:ans){std::cout<<i<<" ";}std::cout<<"1";}else{std::cout<<"-1";}
}
int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);solve();return 0;
}

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

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

相关文章

JAVA面试总结-Redis篇章(三)——缓存雪崩

JAVA面试总结-Redis篇章&#xff08;三&#xff09;——缓存雪崩

go性能分析工具之trace

参考文章&#xff1a; https://eddycjy.gitbook.io/golang/di-9-ke-gong-ju/go-tool-trace https://mp.weixin.qq.com/s__bizMzUxMDQxMDMyNg&mid2247484297&idx1&sn7a01fa4f454189fc3ccdb32a6e0d6897&scene21#wechat_redirect 你有没有考虑过&#xff0c;你的g…

【计算机编程语言】HTML-前端基础知识

文章目录 HTML1.初识HTML1.1什么是HTML 2.网页基本标签2.1标题标签2.2段落标签2.3换行标签2.4水平线标签2.5字体样式标签2.6注释和特殊符号 3.图像、超链接、网页布局3.1图像3.2链接标签3.3网页布局 4、列表、表格、媒体元素4.1列表4.2表格4.3媒体元素 5.页面结构分析6.iframe内…

运维英语基础语法-一般现在时

一般现在时的陈述句-你、我、他&#xff1a; 公式&#xff1a;代词be动词名词 代词&#xff1a; 代词用来代替名词&#xff0c;以避免重复。常见的代词有I, you, he, she, it, we, they, me, him, her, us, them等。 Be动词 am&#xff08;用于第一人称单数&#x…

0基础学习VR全景平台篇 第70篇:VR直播-如何设置付费观看、试看

对于拥有优质内容的VR直播&#xff0c;可以通过付费观看的方式进行内容变现&#xff0c;是当下非常流行的商业模式。 付费价格&#xff1e;0时便会自动弹出“试看时间”的设置项。试看时间&#xff1d;0秒时&#xff0c;用户进入直播间需要先付费才可观看&#xff1b;试看时间&…

Python中字符串拼接有哪些方法

目录 什么是字符串拼接 为什么要进行字符串拼接 Python中字符串拼接有哪些方法&#xff1f; 什么是字符串拼接 字符串拼接是将多个字符串连接在一起形成一个新的字符串的操作。在编程中&#xff0c;字符串拼接经常用于将不同的字符串组合在一起&#xff0c;以创建更长或更有…

Elasticsearch 映射Mappings (三)

文章目录 前言一、Mapping简介查看索引映射 二、自动映射 dynamic mapping自动类型推断mapping注意点 三、手动映射 Expllicit mapping创建索引 四、自动映射模板 Dynamic Templates定义映射模板规则判定&#xff1a;conditlonsmatch_mapping_typematch、unmatchpath_match、pa…

勘探开发人工智能技术:地震层位解释

1 地震层位解释 层位解释是地震构造解释的重要内容&#xff0c;是根据目标层位的地震反射特征如振幅、相位、形态、连续性、特征组合等信息在地震数据体上进行追踪解释获得地震层位数据的方法。 1.1 地震信号、层位与断层 图1.1 所示为地震信号采集的过程&#xff0c;地面炮…

图像处理之canny边缘检测(非极大值抑制和高低阈值)

Canny 边缘检测方法 Canny算子是John F.Canny 大佬在1986年在其发表的论文 《Canny J. A computational approach to edge detection [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1986 (6): 679-698.》提出来的。 检测目标&#xff1a; 低错误率…

xml中的转义字符

xml中的转义字符 &amp;对应的字符是&<对应的字符是<>对应的字符是>&quot;对应的字符是"&apos;对应的字符是 转义的实体引用虽然简单易用&#xff0c;但是需要记忆&#xff0c;而且如果字符串中包含大量的特殊字符&#xff0c;还需要进行逐一替…

学好Elasticsearch系列-Mapping

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 Mapping 的基本概念查看索引 Mapping 字段数据类型数字类型基本数据类型Keywords 类型Dates&#xff08;时间类型&#xff09;对象类型空间数据类型文档排名类型文本搜索类型 两种映射类型自动映射&…

动手学DL——深度学习预备知识随笔【深度学习】【PyTorch】

文章目录 2、预备知识2.1、数据操作2.2、线性代数&矩阵计算2.3、导数2.4、基础优化方法 2、预备知识 2.1、数据操作 batch&#xff1a;以图片数据为例&#xff0c;一次读入的图片数量。 小批量样本可以充分利用GPU进行并行计算提高计算效率。 数据访问 数组&#xff1a;np…

Android 实现阅读用户协议的文字控件效果

开发中&#xff0c;经常要用到一些阅读隐私协议的场景&#xff0c;原生的textview控件很难做到在一个控件里有两个点击事件&#xff0c;那现在就来安利一个强大的组件——SpannableStringBuilder。 先看看效果&#xff1a; 直接上代码&#xff0c;布局文件&#xff1a; <Li…

【图像处理】使用自动编码器进行图像降噪(改进版)

阿里雷扎凯沙瓦尔兹 一、说明 自动编码器是一种学习压缩和重建输入数据的神经网络。它由一个将数据压缩为低维表示的编码器和一个从压缩表示中重建原始数据的解码器组成。该模型使用无监督学习进行训练&#xff0c;旨在最小化输入和重建输出之间的差异。自动编码器可用于降维、…

【iOS】动态链接器dyld

参考&#xff1a;认识 dyld &#xff1a;动态链接器 dyld简介 dyld&#xff08;Dynamic Linker&#xff09;是 macOS 和 iOS 系统中的动态链接器&#xff0c;它是负责在运行时加载和链接动态共享库&#xff08;dylib&#xff09;或可执行文件的组件。在 macOS 系统中&#xf…

STM32MP157驱动开发——按键驱动(定时器)

“定时器 ”机制&#xff1a; 内核函数 定时器涉及函数参考内核源码&#xff1a;include\linux\timer.h 给定时器的各个参数赋值&#xff1a; setup_timer(struct timer_list * timer, void (*function)(unsigned long),unsigned long data)&#xff1a;设置定时器&#xf…

解决 npm ERR! missing script: build 错误的方法

系列文章目录 文章目录 系列文章目录前言一、错误原因二、解决方法&#xff1a;三、注意事项&#xff1a;总结 前言 在使用 npm 进行前端项目构建时&#xff0c;有时会遇到错误信息 “npm ERR! missing script: build”&#xff0c;该错误通常发生在没有定义构建脚本时。本文将…

多元函数的概念

目录 多元函数的极限&#xff1a; 例题1&#xff1a; 例题2&#xff1a; 多元函数的连续性 连续函数的性质 偏导数 高阶偏导数 定理1&#xff1a; 全微分 可微的必要条件 用定义来判断是否可微 可微的充分条件 连续偏导可微的关系 多元函数的极限&#xff1a; 对于一个二元…

macOS Ventura 13.5 (22G74) 正式版发布,ISO、IPSW、PKG 下载

macOS Ventura 13.5 (22G74) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也…

服务器数据库中了Locked勒索病毒,企业应该如何正确处理并采取后续防护措施

网络技术的发展极大地方便了人们的工作生活&#xff0c;但同样带来了一定的网络安全威胁&#xff0c;其中较为危险的威胁就是勒索病毒攻击&#xff0c;勒索病毒不仅会给我们的计算机系统带来破坏&#xff0c;还会加密我们的重要文件数据来敲诈勒索&#xff0c;只有用户支付的赎…