P6623 [省选联考 2020 A 卷] 树
day2t2但难度不大,和AGC044C解法类似
题目大意:
给定一棵 \(n\) 个结点的有根树 \(T\),结点从 \(1\) 开始编号,根结点为 \(1\) 号结点,每个结点有一个正整数权值 \(v_i\)
设 \(x\) 号结点的子树内(包含 \(x\) 自身)的所有结点编号为 \(c_1,c_2,\dots,c_k\),定义 \(x\) 的价值为:
\(val(x)=(v_{c_1}+d(c_1,x)) \oplus (v_{c_2}+d(c_2,x)) \oplus \cdots \oplus (v_{c_k}+d(c_k, x))\)
其中 \(d(x,y)\) 表示树上 \(x\) 号结点与 \(y\) 号结点间路径的边数,\(d(x, x) = 0\)
求 \(\sum\limits_{i=1}^n val(i)\)
小小转化一下,发现能直接先把每个点都赋成输入的点权,然后变成从叶子节点开始自下而上子树内(除了自己)都加1,相当于就是距离了,就很好做了
发现还要求子树异或和合并两个子树信息,直接上01trie,那么这棵trie只需要维护insert,merge,全局+1,查询异或就行了。
merge就是线段树合并类似
全局+1就是交换两棵子树,然后再对新的0儿子子树递归
具体实现,查询可以直接开个数组调用就行,至于怎么计算异或,可以记录下经过0/1的位置,对于第 \(k\) 层的1来说经过奇数次贡献就是 \(2^k\)
代码十分好写
#include<bits/stdc++.h>
#define maxn 525015
#define int long long
using namespace std;
template<class T>
inline T read(){
T r=0,f=0;
char c;
while(!isdigit(c=getchar()))f|=(c=='-');
while(isdigit(c))r=(r*10)+(c^48),c=getchar();
return f?-r:r;
}
int n,val[maxn];
vector<int>nbr[maxn];
/*
1. insert
2. merge
3. ask subtree's XOR
4. all_add_1
*/
int trie[maxn*27][2],root[maxn*27];
int tot=0,num[maxn*27],sum[maxn*27];
inline void pushup(int u,int dep){
sum[u]=sum[trie[u][0]]^sum[trie[u][1]]^((num[trie[u][1]]&1)<<dep);
}
void insert(int &u,int x,int dep){
if(!u)u=++tot;
++num[u];
if(dep>20)return;
int idx=(x>>dep)&1;
insert(trie[u][idx],x,dep+1);
pushup(u,dep);
}
void alladd1(int x,int dep){
if(!x)return;
swap(trie[x][0],trie[x][1]);
alladd1(trie[x][0],dep+1);
pushup(x,dep);
}
int merge(int p,int q,int dep){
if(!p||!q)return p|q;
num[p]+=num[q];
trie[p][0]=merge(trie[p][0],trie[q][0],dep+1);
trie[p][1]=merge(trie[p][1],trie[q][1],dep+1);
pushup(p,dep);
return p;
}
inline int askxor(int x){
return sum[x];
}
int ans=0;
void solve(int x,int lst){
for(int i=0;i<nbr[x].size();i++){
int to=nbr[x][i];
if(to==lst)continue;
solve(to,x);
root[x]=merge(root[x],root[to],0);
}
alladd1(root[x],0);
insert(root[x],val[x],0);
ans+=askxor(root[x]);
}
signed main(){
n=read<int>();
for(int i=1;i<=n;i++){
val[i]=read<int>();
}
for(int i=2;i<=n;i++){
int fa=read<int>();
nbr[i].emplace_back(fa);
nbr[fa].emplace_back(i);
}
solve(1,0);
printf("%lld\n",ans);
return 0;
}
P6623 [省选联考 2020 A 卷] 树的更多相关文章
- 洛谷P6623——[省选联考 2020 A 卷] 树
传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- [省选联考 2020 A 卷] 组合数问题
题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...
- luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)
luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...
- luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)
luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...
- P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
正题 题目链接:https://www.luogu.com.cn/problem/P6628 题目大意 给出\(n\)个点的一张完全无向图,\(i\sim j\)的边权是\(|i-j|\). 然后给出 ...
- 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)
题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...
- [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂
题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...
- 题解 P6622 [省选联考 2020 A/B 卷] 信号传递
洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...
- luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...
随机推荐
- Solution Set - LCT
A[洛谷P3690]维护一个森林,支持询问路径xor和,连边(已连通则忽略),删边(无边则忽略),改变点权. B[洛谷P3203]\(n\)个装置编号为\(0,...,n-1\),从\(i\)可以一步 ...
- Surge多配置文件聚合配置方法
目录 摘要 1. Surge配置原理 2. Surge托管配置 3. Surge多配置文件聚合配置 (1)找到配置文件 (2)编辑配置文件 参考 摘要 Surge 是一个在 macOS 和iOS 平台 ...
- 解决VMware Workstation 与 Device/Credential Guard不兼容
参考文档 https://blog.csdn.net/lizhengze1117/article/details/106566060
- ruby中的Hash排序
参考: https://blog.csdn.net/xing102172/article/details/9163607 For example: h={'a'=>2, 'c'=>1, ' ...
- three.js介绍和学习资料说明
1.three.js能做什么 Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多.使用最广泛的三维引擎.既然Threejs是一款WebGL ...
- 说一下flex的属性
flex-grow项目的放大比例,默认为0,即如果存在剩余空间,也不放大. flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小.负值对该属性无效. flex-bas ...
- AIRIOT答疑第2期|如何使用物联网平台的数据采集与控制引擎?
任性用! 作为AIRIOT物联网低代码平台的五大核心能力引擎之一,数据采集与控制引擎具备极强的系统集成能力,提供丰富的接口,具备海量工业设备驱动库,分布式采集,稳定性高,实现快速的设备接入.报警. ...
- Stenciljs 学习之搭建项目
框架介绍 stenciljs 是用于构建可重用.可扩展的设计系统的工具链.生成在每个浏览器中运行的小型.超快且 100% 基于标准的 Web Component. 更对介绍请参考官方网站 创建项目 使 ...
- 【超强SQL】WordPress批量修改指定分类下所有文章状态
前阵子主题君的某一个手游下载站的某一个分类,被百度K了,导致整个分类的文章收录都没了,这时候如果想要回复权重,就需要把这个分类的文章都删除了. 下面主题君给大家分享一段巨牛逼的SQL, WordPre ...
- SpringMVC在返回JSON数据时出现406错误解决方案
在SpringMVC框架的使用中常常会使用@ResponseBody注解,修饰"处理器"(Controller的方法),这样在处理器在返回完毕后,就不走逻辑视图,而是将返回的对象转 ...