传送门:QAQQAQ

题意:自己看

思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分

(思路来源于https://www.luogu.com.cn/blog/dengyaotriangle/solution-p6623)

首先我们企图树形DP,但是发现每一个元素往上推一格都会+1,所以我们对于二进制每一位考虑贡献。

顶点u对他祖先的二进制第k位贡献,可能是0可能是1,但不断+1时变化是一个混循环,刨掉最开始的,后面都是规则的循环,2^k个0,2^k个1。所以我们可以对有影响的1进行第一次差分

但是因为有多个区间,尤其是$k=0$时复杂度到达O(n2),所以我们再用一次差分:考虑到差分每次赋值的上下两个点分别对于2^k同余,所以我们对于余数再建一个数组,改的区间一定是连续的,就又可以优化成O(1)了

总复杂度$O(nlog(n))$

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=530000;
int a[N],f[N],n,val[N],dp[21][N],dep[N];//(dep+a[])%2^k==i
int base[21];
ll ans=0;
vector<int> v[N]; int dfs(int u)
{
int ret=a[u];
for(int i=0;i<=20;i++) dp[i][(dep[u]+a[u])%base[i]]^=base[i];
for(int i=0;i<=20;i++) ret^=dp[i][dep[u]%base[i]];
for(int i=0;i<v[u].size();i++)
{
int to=v[u][i];
dep[to]=dep[u]+1;
ret^=dfs(to);
}
for(int i=0;i<=20;i++) ret^=dp[i][dep[u]%base[i]];
//上下两个相同的操作是为了异或掉不是u子树的贡献
ans+=1LL*ret;
return ret;
} int main()
{
base[0]=1;
for(int i=1;i<=20;i++) base[i]=base[i-1]*2;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=2;i<=n;i++)
{
scanf("%d",&f[i]);
v[f[i]].push_back(i);
}
dfs(1);
cout<<ans<<endl;
return 0;
}

这份代码让刚才那个思路更好实现:假如u下面的子树已经算好,那么所有元素+1后再去考虑二进制每一位的贡献,当且仅当该位0->1或1->0时才要异或,即在循环节中间或末尾,即$a[v]+dep[v]$与$dep[u]$关于2^k同余(2^(k+1)为循环节)

(留坑更新线段树合并做法)

洛谷P6623——[省选联考 2020 A 卷] 树的更多相关文章

  1. 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)

    题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...

  2. [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂

    题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...

  3. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  4. 洛谷 P7520 - [省选联考 2021 A 卷] 支配(支配树)

    洛谷题面传送门 真·支配树不 sb 的题. 首先题面已经疯狂暗示咱们建出支配树对吧,那咱就老老实实建呗.由于这题数据范围允许 \(n^2\)​ 算法通过,因此可以考虑 \(\mathcal O(n^2 ...

  5. 洛谷 P7515 - [省选联考 2021 A 卷] 矩阵游戏(差分约束)

    题面传送门 emmm--怎么评价这个题呢,赛后学完差分约束之后看题解感觉没那么 dl,可是现场为啥就因为种种原因想不到呢?显然是 wtcl( 先不考虑"非负"及" \(\ ...

  6. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  7. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  8. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  9. 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)

    洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\)​ \(10^9\)​ 的时代了吗?落伍了落伍了/ ...

随机推荐

  1. 如何学习iOS开发?iOS Developer Library足矣!

    记得上高中的时候,寄信请教二哥学习经验,二哥来信介绍学习经验说:资料书要快速阅读,把书上的题做完,然后再买几套资料书(习题集)继续练习. 这是二哥的经验,因为他自学能力强,可以消化多套资料书. 我仿照 ...

  2. C/的常用位运算符

    双目运算符 位逻辑运算符 有6种位运算: & 与运算 | 或运算 ^ 异或运算 ! 非运算(求补) >> 右移运算 << 左移运算 与运算(&)双目运算.二个位 ...

  3. python排序算法总结和实现

    ------------------希尔排序------------- 一直没搞懂希尔排序怎么搞得 def Shell_sort(L): step = len(L)/2 while step > ...

  4. 如何选择JVM垃圾回收器?

    明确垃圾回收器组合 -XX:+UseSerialGC 年轻代和老年代都用串行收集器 -XX:+UseParNewGC 年轻代使用ParNew,老年代使用 Serial Old -XX:+UsePara ...

  5. java中break、continue、return作用

    java中break.continue.return作用 0.首先要明确:break和continue是作用对象是循环体:而return的作用对象是方法 break:在执行完本次循环后,跳出所在的循环 ...

  6. python 不定长参数

    1 #不定长参数 * 元祖 ** 字典 2 def item(a,b,*c,**d): 3 print(a) 4 print(b) 5 print(c) 6 print(d) 7 8 item(11, ...

  7. Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输

    github 地址:https://github.com/duyanming/dymDemo dym 分布式开发框架 Demo 熔断 限流 事件总线(包括基于内存的.rabbitmq的) CQRS D ...

  8. HDU - 6736 F - Forest Program

    题意 给你n个点m条边,并且保证整个图是仙人掌. 仙人掌:每条边仅属于1条或者0条回路 且无重边和自环 让你删掉一些边使其变成一棵树(拥有点数-1条边) 注意一个点也是森林 图可能是不联通的 思路 考 ...

  9. matplotlib条形图

    三个班级平均分 import matplotlib.pyplot as plt import matplotlib as mpl classes = ['class1','class2','class ...

  10. Flink on Yarn三部曲之一:准备工作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...