P6623-[省选联考2020A卷]树【Trie,树上启发式合并】

正题

题目链接:https://www.luogu.com.cn/problem/P6623


题目大意

一棵树,每个节点有一个权值valival_ivali,定义disi,jdis_{i,j}disi,j表示iiijjj的距离。

一个节点xxx的权值定义为该节点子树中的每个节点yyydisx,y+valjdis_{x,y}+val_{j}disx,y+valj的异或和。

求所有节点的权值和


解题思路

对于一个二进制010101串,我们可以用TrieTrieTrie从高位到低位存,我们记录TrieTrieTrie上每个位置的答案,考虑如何让整个TrieTrieTrie上的数字+1+1+1

显然对于一个000指向的节点,它会变成111,对于111指向的节点,它会变成000并且进位。也就是我们交换左右子树后再向原来111指向的节点进位。

这样我们就实现了一个可以插入数字或者全部+1+1+1来维护答案的数据结构,之后用树上启发式合并即可。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=6e5+10,M=27;
struct node{int to,next;
}a[N];
int n,tot,cnt,ls[N],siz[N],son[N];
int w[N],s[N*M],v[N*M],ch[N*M][2],ed[N*M],z;
long long ans;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void Make(int &x,int k){if(!x){x=++cnt;ch[x][0]=ch[x][1]=s[x]=ed[x]=v[x]=0;}if(!k){s[x]^=1;ed[x]^=1;return;}Make(ch[x][k&1],k>>1);s[x]=s[ch[x][0]]^s[ch[x][1]]^ed[x];v[x]=(v[ch[x][0]]<<1)^((v[ch[x][1]]<<1)|s[ch[x][1]]);return;
}
void Merge(int x){if(!x){return;}swap(ch[x][0],ch[x][1]);if(ed[x]&&!ch[x][1]){ch[x][1]=++cnt;ch[cnt][0]=ch[cnt][1]=s[cnt]=ed[cnt]=v[cnt]=0;}ed[ch[x][1]]^=ed[x];s[ch[x][1]]^=ed[x];ed[x]=0;Merge(ch[x][0]);s[x]=s[ch[x][0]]^s[ch[x][1]]^ed[x];v[x]=(v[ch[x][0]]<<1)^((v[ch[x][1]]<<1)|s[ch[x][1]]);return;
}
void dfs(int x){siz[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;dfs(y);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}return;
}
void calc(int x,int dep){Make(z,w[x]+dep);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;calc(y,dep+1);}return;
}
void solve(int x){for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==son[x])continue;solve(y);}cnt=z=0;if(son[x])solve(son[x]),Merge(z);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==son[x])continue;calc(y,1);}Make(z,w[x]);ans+=v[1];return;
}
int main()
{freopen("tree2.in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int i=2;i<=n;i++){int x;scanf("%d",&x);addl(x,i);}dfs(1);solve(1);printf("%lld",ans);
}

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

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

相关文章

【DP】过桥

过桥 题目大意&#xff1a; 有n个人要过一条桥&#xff0c;每个人都有自己的过桥时间&#xff0c;一条桥同时只能有2个人过&#xff08;过桥时间求较慢的一人&#xff09;&#xff0c;且要有人拿着手电筒才能过&#xff0c;只有一个手电筒&#xff0c;且不能扔手电筒&#xf…

.NET Core完成向RyuJIT的迁移

.NET Core CLR团队宣布&#xff0c;他们的.NET Core平台现在已经是完全基于其下一代即时编译器RyuJIT。有人可能不知道&#xff0c;在.NET Core中&#xff0c;编译器&#xff08;Roslyn&#xff09;会把C#代码编译成CIL&#xff08;公共中间语言&#xff09;字节码。接下来&…

P3166-[CQOI2014]数三角形【GCD】

正题 题目链接:https://www.luogu.com.cn/problem/P3166 题目大意 求一个N∗MN*MN∗M的网格上有多少个三角形。 解题思路 考虑减去共线的情况&#xff0c;我们分为两种情况。一是平行于坐标轴的&#xff0c;这个很好算。二是倾斜的&#xff0c;我们考虑如何计算斜下角的。 …

【DP】【BFS】迷之阶梯

迷之阶梯 题目大意&#xff1a; 有n层阶梯&#xff0c;如果上面一层离这一层只有1个单位高度&#xff0c;就可以直接上去&#xff0c;也可以下去一层&#xff0c;当下去k层时&#xff0c;可以向上飞2k{2}^{k}2k个单位高度&#xff0c;当然要找到一个小于等于这个高度的阶梯落…

UVA10601 Cubes - 波利亚定理

Cubes 题意 给出121212根长度相等的木棒,颜色最多有666种,问能构成的本质不同的正方体数量. 题解 根据波利亚定理公式: 设X是元素集合,G是X的置换群,{u1,u2,...,uk}\{u_1,u_2,...,u_k\}{u1​,u2​,...,uk​}是kkk种颜色的集合,CCC是XXX的任意着色集.这时,针对各颜色的数目的…

COMCMS_CORE 起步篇,如何运行和部署

前言&#xff1a;关于最近开源后&#xff0c;不少朋友问&#xff0c;怎么我下载下来&#xff0c;运行不了。或者怎么没有左边菜单。货不对板&#xff1f;还是我吃了数据&#xff1f;感言&#xff1a;开源不容易&#xff0c;更不容易的是&#xff0c;明明毫无保留&#xff0c;还…

P4313-文理分科【最小割】

正题 题目链接:https://www.luogu.com.cn/problem/P4313 题目大意 有n∗mn*mn∗m个人&#xff0c;第(i,j)(i,j)(i,j)选择文科就可以获得arti,jart_{i,j}arti,j​的价值&#xff0c;选择理科就可以获得scii,jsci_{i,j}scii,j​的价值。如果一个选择文科的人周围都选择了文科&a…

初一模拟赛总结(3.30)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf360360360100100100100100100606060100100100222wjjwjjwjj170170170100100100707070000000333fyfyfy167167167100100100505050000171717444hkyhkyhky11011011010010010000000010…

UVALive7670 Asa's Chess Problem,上下界费用流,另类解法

Asa’s Chess Problem 先阐述一下带上下界的边怎么建. 带上下界的建图方法 设我要建一条边(u→v)(u\rightarrow v)(u→v),流量上界为upupup,下界为downdowndown,费用为costcostcost.则我需要建两条边. 为保证一定会有downdowndown的流量流过去,我们可以建立一条u→vu \right…

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

引言在使用asp.net core 进行api开发完成后&#xff0c;书写api说明文档对于程序员来说想必是件很痛苦的事情吧&#xff0c;但文档又必须写&#xff0c;而且文档的格式如果没有具体要求的话&#xff0c;最终完成的文档则完全取决于开发者的心情。或者详细点&#xff0c;或者简单…

P3201-[HNOI2009]梦幻布丁【启发式合并,链表】

正题 题目链接:https://www.luogu.com.cn/problem/P3201 题目大意 开始有nnn个布丁&#xff0c;第iii个是cic_ici​颜色的。 每次有操作 将所有颜色为xxx的布丁变为颜色yyy的。询问有多少个布丁颜色段。 解题思路 对于每次修改&#xff0c;我们可以考虑启发式合并&#xff…

【贪心】奶酪厂(jzoj 1285)

奶酪厂 题目大意&#xff1a; 有一个奶酪厂&#xff0c;每个星期&#xff08;共n个星期&#xff09;都有一定的单位生产成本和客户需求量&#xff0c;把奶酪保存一个星期每单位要s元&#xff0c;问一共花的钱最少是多少 Sample Input 4 5 88 200 89 400 97 300 91 500Sampl…

P3768 简单的数学题 [狄利克雷卷积,杜教筛,莫比乌斯反演]

简单的数学题 题目连接 https://www.luogu.org/problemnew/show/P3768 题目描述 输入一个正整数n,n≤1010n,n\le 10^{10}n,n≤1010和p,p≤1.1109p,p \le 1.1 \times 10^9p,p≤1.1109.且ppp为质数. 计算∑i1n∑j1nijgcd(i,j)\sum_{i1}^n\sum_{j1}^nijgcd(i,j)∑i1n​∑j1n​…

.NET Core微服务之基于Exceptionless实现分布式日志记录

一、Exceptionless极简介绍Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技术开发的应用程序中&#x…

P2801-教主的魔法【分块,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P2801 题目大意 nnn个数字&#xff0c;要求支持 区间加上一个数字www询问一个区间内不小于www的数的个数 解题思路 考虑分块&#xff0c;对于块内我们维护一个排序后的数组&#xff0c;查询时直接在整个块中二分答案即可。修…

【多重背包】太空电梯(jzoj 1286)

太空电梯 题目大意&#xff1a; 有n&#xff08;1<n<400&#xff09;种石头&#xff0c;每种石头有它的数量c&#xff08;1<c<10&#xff09;&#xff0c;高度h&#xff08;1<h<100&#xff09;&#xff0c;可搭到的最高高度a&#xff08;1<a<40000&…

P2522 HAOI2011 Problem b [莫比乌斯反演,数论分块]

P2522 HAOI2011 题意 对于给出的n个询问&#xff0c;每次求有多少个数对(x,y)(x,y)(x,y)&#xff0c;满足a≤x≤ba≤x≤ba≤x≤b&#xff0c;c≤y≤dc≤y≤dc≤y≤d&#xff0c;且gcd(x,y)kgcd(x,y) kgcd(x,y)k&#xff0c;gcd(x,y)gcd(x,y)gcd(x,y)函数为xxx和yyy的最大公约…

.netcore 整合 log4net

1.背景前两天&#xff0c;曾经的一个同事咨询我&#xff0c;怎样将log4net以中间件的形式整合到core里边去。我不假思索的回答&#xff0c;这种问题应该有人做过吧&#xff0c;他说没有。于是&#xff0c;我去博客园搜了下&#xff0c;发现还真没有&#xff0c;全部都是传统.NE…

P5459-[BJOI2016]回转寿司【树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P5459 题目大意 nnn个数&#xff0c;求有多少个区间和在[L,R][L,R][L,R]范围内。 解题思路 显然我们做了前缀和之后&#xff0c;枚举右端点就只需要找到有多少个左端点满足在[x−R,x−L][x-R,x-L][x−R,x−L]这个范围内就好了…

【暴力】穹妹的求助

穹妹的求助 题目大意&#xff1a; 输入两个数&#xff0c;输出这两个数之间因数最多的数&#xff0c;和这个数的的因数个数 原题&#xff1a; 题目描述 由于穹妹很聪明&#xff0c;她的数学老师给她布置了一个作业&#xff0c;让她求出L到R之间不同因子数最多的那个数和这…