LGP6623 [PUTS 2020A] 树 学习笔记

news/2025/2/15 8:20:51/文章来源:https://www.cnblogs.com/OrinLoong/p/18716487

蓝的写。先放个带注释代码凑数。

```cpp
#include <bits/stdc++.h>
using namespace std;
namespace obasic{typedef long long lolo;typedef vector<int> vecint;template <typename _T>void readi(_T &x){_T k=1;x=0;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')k=-1;for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0';x*=k;return;}template <typename _T>void writi(_T x){if(x<0)putchar('-'),x=-x;if(x>9)writi(x/10);putchar(x%10+'0');}
};
using namespace obasic;
const int MaxN=5.3e5,MaxNb=21;
int N,A[MaxN],X,W[MaxNb][MaxN];
vector<int> Tr[MaxN];lolo fans;
void addedge(int u,int v){Tr[u].push_back(v);}
lolo dfs(int u,int d){int cans=A[u];for(int i=0;i<MaxNb;i++)W[i][(d+A[u])&((1<<i)-1)]^=(1<<i);//我们来思考一下,首先我们知道当我们按位考虑//第k位会给自己的U[b2^(k+1)+a,b2^(k+1)+a+2^k)级祖先打一个加1的贡献。//要给这么多区间打贡献,不如直接打差分。然而这样仍然是O(N^2)的。//观察到所有要打上差分的下标模2^k相等,所以把它们丢在一个桶里面自取。//问题来了,这个a等价于什么?代码里面又要怎么写?//(上文a并不实际出现在代码中)//推理一下,深度为d的u,其末k位为A[u]的;//深度为d-1的u,其末那些位就是为A[u]+1的。//(感性理解,模意义下)深度为d+A[u]的u,其末那些位就是为0的。//相应地深度为d+A[u]+2^k的u开始其末那些位就是为1的。//那差分数组就刚好打在所有模2^k余((d+A[u])%(2^k))的地方了//很巧妙的树上开桶差分算贡献,可以和LGP1600相媲美//建议对照学习,更深刻地体会树上差分思想。for(int i=0;i<MaxNb;i++)cans^=W[i][d&((1<<i)-1)];for(int v : Tr[u])cans^=dfs(v,d+1);for(int i=0;i<MaxNb;i++)cans^=W[i][d&((1<<i)-1)];//进dfs异或一道,出dfs再异或一道//可以理解为先xor a再xor (a xor b)//等效于xor b,b即子树内做出来的贡献//这归功于异或有自反性。fans+=cans;return cans;
}
int main(){readi(N);for(int i=1;i<=N;i++)readi(A[i]);for(int i=2;i<=N;i++)readi(X),addedge(X,i);dfs(1,0);writi(fans);return 0;
}

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

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

相关文章

五分钟搞定!Linux平台上用Ansible自动化部署SQL Server AlwaysOn集群

五分钟搞定!Linux平台上用Ansible自动化部署SQL Server AlwaysOn集群前言 以下内容是由红帽官方博客整理而成,使用Ansible在Linux平台上自动化部署SQL Server AlwaysOn集群不熟悉整个流程的朋友可以先看之前的部署文章,手动部署一遍 从DNS配置到Pacemaker部署:一步步教你在…

Wireshark的部署(学习笔记)

〇、大纲 1、远程数据包捕获 2、集线器环境下数据包捕获 3、交换机环境下数据包捕获 4、本地流量的捕获 5、虚拟机流量的捕获 一、远程数据包捕获 情形:需要异地管理分析服务器流量,有服务器控制权。方案:使用WinPcap下的Rpcap运行在目标服务器上,向远程控制机传回流量。服…

LeetCode 第24题:两两交换链表中的节点

LeetCode 第24题:两两交换链表中的节点 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 难度 中等 题目链接 https://leetcode.cn/problems/swap-nodes-in-pairs/ 示例 示…

LeetCode 第25题:K 个一组翻转链表

LeetCode 第25题:K 个一组翻转链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 不能只是单纯的改变节点内部的值,…

HJ25 数据分类处理

题目:我的答案: #include <iostream> #include <string> #include <vector> #include <set> #include <map>using namespace std;bool match(const int R, const string &I) {if (I.find(to_string(R)) != std::string::npos){return true;}…

Java Web - 后端

Java Web 后端的基础知识: Maven, Spring Boot, MySQL, JDBC, MyBatisJava Web - 后端 Maven 基于项目对象模型 (POM) 的概念, 通过一小段描述信息来管理项目的构建 官网各种插件以构建生命周期/阶段依赖管理模型从仓库中查找 jar包仓库: 存储资源, 管理 jar包本地仓库: 自己计…

汇编语言笔记_1

汇编语言学习笔记(一)1.基础知识 汇编语言是直接在硬件上工作的语言,本章重在了解硬件系统结构 1.1 机器语言 CPU(中央处理单元)是一种微处理器,功能是执行机器指令每一种微处理器由于硬件设计和内部结构的不同,有自己的机器指令集,也就是机器语言由于机器码晦涩难懂和…

基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证

1.算法运行效果图预览 (完整程序运行后无水印)这里实现的是256*256双线性插值到512*512的系统模块局部放大:将数据导入到matlab,得到插值效果图:2.算法运行软件版本 matlab2022avivado2019.23.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)`timescale 1ns / 1…

Windows Teminal 自定义标题

背景与痛点场景: 开发环境,用命令行开了好几个微服务,窗口标题都是一样的,不好分清哪个窗口是哪个服务的了。所有窗口默认显示相同的标题(如"C:\Windows\System32\cmd.exe dotnet run")。窗口多了,切换也不方便。 解决方案: 使用Windows Teminal 来运行命令启…

前端开发day2

前端开发day2 今日概要:案例应用(利用之前所学知识) CSS知识点 模板 + CSS + 构建页面1.CSS案例 1.1 内容回顾HTML标签 固定格式,记住标签长什么样子,例如: h/div/span/a/img/ul/li/table/input/formCSS样式引用CSS:标签、头部、文件 .xx{... }<div class=xx xx>&…