CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

II.II.CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

名字真长

假如它没有”在每个子树中最长“的限制,我们倒真可以点分治,然后就是水题了;但是它要求在每个子树中最长,怎么办呢?

直接上dsu on tree就行了。思想还是借鉴点分治,所有点对都在LCA处处理就行。先处理轻儿子子树并回撤,然后处理重儿子不回撤,然后加入自身及轻儿子影响。在加入一坨东西时,要先查看桶中是否有能与其配对成回文串的另一半(明显一共只有 23 种),然后再加,这是避免子树内部配对。都是点分治的老套路了,不必多说。

所以dsu on tree似乎能完美替代大部分点分治的题

代码:

#include<bits/stdc++.h>
using namespace std;
int n,msk[500100],fa[500100],son[500100],sz[500100],dep[500100],buc[1<<22],res[500100],ans;
char s[10];
vector<int>v[500100];
void dfs1(int x){
	sz[x]=1;
	for(auto y:v[x]){
		dep[y]=dep[x]+1,dfs1(y),sz[x]+=sz[y];
		if(sz[son[x]]<sz[y])son[x]=y;
	}
}
void dfsread(int x){
	if(buc[msk[x]]!=-1)ans=max(ans,dep[x]+buc[msk[x]]);
	for(int i=0;i<22;i++)if(buc[msk[x]^(1<<i)]!=-1)ans=max(ans,dep[x]+buc[msk[x]^(1<<i)]);
	for(auto y:v[x])dfsread(y);
}
void dfswrite(int x){
	buc[msk[x]]=max(buc[msk[x]],dep[x]);
	for(auto y:v[x])dfswrite(y);
}
void dfserase(int x){
	buc[msk[x]]=-1;
	for(auto y:v[x])dfserase(y);
}
void dsuontree(int x){
	for(auto y:v[x])if(y!=son[x])dsuontree(y),dfserase(y);
	if(son[x])dsuontree(son[x]);
	ans=0;
	buc[msk[x]]=max(buc[msk[x]],dep[x]);
	if(buc[msk[x]]!=-1)ans=max(ans,dep[x]+buc[msk[x]]);
	for(int i=0;i<22;i++)if(buc[msk[x]^(1<<i)]!=-1)ans=max(ans,dep[x]+buc[msk[x]^(1<<i)]);
	for(auto y:v[x])if(y!=son[x])dfsread(y),dfswrite(y);
	res[x]=ans-2*dep[x];
	for(auto y:v[x])res[x]=max(res[x],res[y]);
}
int main(){
	scanf("%d",&n),memset(buc,-1,sizeof(buc));
	for(int i=2;i<=n;i++)scanf("%d%s",&fa[i],s),msk[i]=msk[fa[i]]^(1<<(s[0]-'a')),v[fa[i]].push_back(i);
	dfs1(1);
	dsuontree(1);
	for(int i=1;i<=n;i++)printf("%d ",res[i]);
	return 0;
}
posted @   Troverld  阅读(64)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示