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

Luogu

题外话:

。。。想不出来啥好说的了。

我认识的人基本都切这道题了。

就我只会10分暴力。

我是傻逼。

题解时间

先不想用什么维护,拆分成如下操作:

插入,合并,全局异或和,全局加一。

全局加一咋做?

Trie树变成从低位到高位记录就好。

全局加一就是直接反转,看到进位(这一位存在1方向节点变成0方向节点)就递归下去继续反转。

然后就没了。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int N=530011;
struct sumireko{int to,ne;}e[N];int he[N],ecnt;
void addline(int f,int t){e[++ecnt].to=t;e[ecnt].ne=he[f],he[f]=ecnt;}
int n,v[N],fa[N];lint ans;
int rt[N],tcnt;
struct remilia{int d,s,v,son[2];}t[N<<5];
int merge(int x,int y)
{
if(!x||!y) return x|y;
t[x].s+=t[y].s,t[x].v^=t[y].v;
t[x].son[0]=merge(t[x].son[0],t[y].son[0]);
t[x].son[1]=merge(t[x].son[1],t[y].son[1]);
return x;
}
void fuckup(int x)
{
t[x].s=t[t[x].son[0]].s+t[t[x].son[1]].s;
t[x].v=t[t[x].son[0]].v^t[t[x].son[1]].v;
if(t[x].son[1]) t[x].v^=(t[t[x].son[1]].s&1)<<t[x].d;
}
void change(int x){swap(t[x].son[0],t[x].son[1]);if(t[x].son[0]) change(t[x].son[0]);fuckup(x);}
void insert(int x,int w)
{
if(t[x].d==26) return (void)(t[x].s++);
int &y=t[x].son[(w>>t[x].d)&1];
if(!y) y=++tcnt,t[y].d=t[x].d+1;insert(y,w);
fuckup(x);
}
void dfs(int x)
{
rt[x]=++tcnt;
for(int i=he[x],t=e[i].to;i;i=e[i].ne,t=e[i].to) dfs(t),rt[x]=merge(rt[x],rt[t]);
change(rt[x]),insert(rt[x],v[x]),ans+=t[rt[x]].v;
}
int main()
{
read(n);for(int i=1;i<=n;i++) read(v[i]);for(int i=2;i<=n;i++) read(fa[i]),addline(fa[i],i);
dfs(1);printf("%lld",ans);
return 0;
}
}
int main(){return RKK::main();}

最新文章

  1. 谈asch系统的共识机制与容错性
  2. 软件开发流程 Software development process
  3. python——Django(ORM连表操作)
  4. 使用MySQL WorkBench导出数据库
  5. centos rpmforge repo
  6. Apache配置代理服务器的方法(1)
  7. Spring MVC小结
  8. 9月15日,YTFCloud,创业圈的技术新宠
  9. android strings.xml 报 is not translated in af,
  10. 改变DataGrid某一行和单元格的颜色
  11. JSBinding + SharpKit / 实战:转换 Survival Shooter
  12. python学习笔记enumerate()与range(len)运用及赋值小计
  13. C#开发移动应用系列(1.环境搭建)
  14. day04 流程控制
  15. 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)
  16. .NET平台常用的框架
  17. Solr4.7.0连接MySQL
  18. 网络协议学习(2)---IP地址
  19. javascript 添加行,删除行,datepicker获取当前日期和上一个月日期并设置格式,笔记
  20. Redis简单延时队列

热门文章

  1. 基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台
  2. Solution -「AGC 019E」「AT 2704」Shuffle and Swap
  3. 请你说说Spring
  4. 『无为则无心』Python面向对象 — 45、面向对象编程
  5. 利用SQL语句(命令方式)创建数据库(以及句子解释)
  6. 使用SpringBoot整合MybatisPlus出现 : java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
  7. mysql5.7下载
  8. golang线程安全
  9. .Net Core之选项模式Options使用
  10. Java -- int与String相互转换