当前位置: 首页 > news >正文

树上启发加点分治思想

题目链接

思路:

        对于一条链可以组成回文串,意味着最多只有一个奇数字母,比起我们记录路径各个字母的个数和,我们可以发现回文串实际上不在意真正的个数,只在意个数的奇偶。又我们发现字母只有20来个,可以使用状态压缩,那么我们只需要判断压缩后状态里1的个数是否为0或者1.

        对于树上的链异或和,我们都可以用前缀异或和的思想,将x->y的异或和看成v[x]^v[fa[lca]]^v[y]^v[fa[lca]],v表示该点到根的异或和,可以发现就等于两个位置的异或和。

        对于以x为根的子树里的链只有三种情况:

        1.不经过根

        2.链的一端是根

        3.跨过根

        容易知道,对于第1种情况我们可以看成x子树里的某个子树的情况3,所以我们只需要计算每个点的子树里的2,3情况即可。

        假如我们遍历到第y个子树,前面已经遍历处理完x个子树。我们要处理y和前面x个子树的跨根贡献的话,我们不能先将y子树的值处理了,因为这可能导致结果是y和y子树里不经过根的链,

所以对于每次我们先calc掉x和y的链,再add掉y这个子树的内容。

        代码:

#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const int N=5e5+10;
const int mod=1e9+7;
#define fi first
#define se secondint n,val[N];
vector<int> ve[N];
int son[N],siz[N];
int fac[30],mask[N],dep[N];
int ans[N],maxx,vis[(1<<25)];
int flag;
int rtdis;void dfs1(int x,int f){siz[x]=1;dep[x]=dep[f]+1;for(auto y:ve[x]){if(y==f) continue;mask[y]^=mask[x];	dfs1(y,x);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}
}void calc(int u,int f){if(vis[mask[u]]){maxx=max(maxx,vis[mask[u]]+dep[u]-rtdis);}for(int i=0;i<=22;i++){if(vis[mask[u]^fac[i]]){maxx=max(maxx,vis[mask[u]^fac[i]]+dep[u]-rtdis);}}for(auto v:ve[u]){if(v==f||v==flag)continue;calc(v,u);}
}void add(int u,int f,int value){if(value==1){vis[mask[u]]=max(vis[mask[u]],dep[u]);}else{vis[mask[u]]=0;}for(auto v:ve[u]){if(v==f||v==flag)continue;add(v,u,value);}
}
void dfs2(int u,int f,bool keep){for(auto v:ve[u]){if(v==f||v==son[u])continue;dfs2(v,u,0);ans[u]=max(ans[u],ans[v]);//不经过根节点 }if(son[u]){dfs2(son[u],u,1);flag=son[u];ans[u]=max(ans[u],ans[son[u]]);//不经过根节点 }rtdis=dep[u]*2;//根节点的dep两倍,方便下面for循环计算跨根的距离 for(auto v:ve[u]){//计算跨根距离,dis(u,v)=dep(u)+dep(v)-2dep(lca),lca就是现在的u if(v==f||v==flag)continue;calc(v,u);//跨根计算和点分治一样,遍历了x个子树,现在是y子树,先不加y子树的贡献 add(v,u,1);//先计算y到前面x个子树的距离,算完再加上y子树的贡献,add }//以根为一端 if(vis[mask[u]]){//异或为0 maxx=max(maxx,vis[mask[u]]-dep[u]);}for(int i=0;i<=22;i++){//遍历异或和为2的幂 if(vis[mask[u]^fac[i]]){maxx=max(maxx,vis[mask[u]^fac[i]]-dep[u]);}}//前面的add都是从子节点进去的,没有跟新到当前节点 vis[mask[u]]=max(vis[mask[u]],dep[u]);//同理先不算当前节点的贡献,算完这种情况再add flag=0; //flag清空是为了下面如果keep=0时把整个子树删掉(包括这颗子树的重儿子) ans[u]=max(maxx,ans[u]);//三种情况都计算完了再更新答案 if(!keep){add(u,f,-1);//add里没有重置maxx和rtdis maxx=0;//答案已经存在ans【u】了,删除整个子树要重置maxx//maxx不重置在回溯回去更新其他子树(不包括当前maxx链的子树)答案会可能取不到这个maxx //rtdis=0;rtdis可重置可不重置,因为用前都重新赋值 } 
}
void solve(){cin>>n;fac[0]=1;for(int i=1;i<=23;i++)fac[i]=fac[i-1]*2;for(int i=2;i<=n;i++){int a;char b;cin>>a>>b;ve[a].push_back(i);ve[i].push_back(a);val[i]=fac[b-'a'];mask[i]=fac[b-'a'];}dfs1(1,0);dfs2(1,0,0);for(int i=1;i<=n;i++)cout<<ans[i]<<' ';
}
signed  main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;//cin>>t;while(t--){solve();}return 0;
}

相关文章:

树上启发加点分治思想

题目链接 思路&#xff1a; 对于一条链可以组成回文串&#xff0c;意味着最多只有一个奇数字母&#xff0c;比起我们记录路径各个字母的个数和&#xff0c;我们可以发现回文串实际上不在意真正的个数&#xff0c;只在意个数的奇偶。又我们发现字母只有20来个&#xff0c;可以使…...

【iOS】类对象的结构分析

目录 对象的分类object_getClass和class方法isa流程和继承链分析isa流程实例验证类的继承链实例验证 类的结构cache_t结构bits分析实例验证属性properties方法methods协议protocolsro类方法 类结构流程图解 对象的分类 OC中的对象主要可以分为3种&#xff1a;实例对象&#xf…...

接口性能优化思路

前言 日常开发中设计接口&#xff0c;响应时间是衡量一个接口质量的重要指标。 接口响应时间这里粗糙地分为三种&#xff1a; 即时响应&#xff1a;毫秒级&#xff0c;小于500毫秒快速响应&#xff1a;秒级&#xff0c;大于500毫秒且小于2秒长时间操作&#xff1a;大于2秒&a…...

PyQt5 多线程编程详细教程

PyQt5 多线程编程详细教程 在 PyQt5 中&#xff0c;多线程编程是提高应用程序性能和响应性的重要手段。本教程将详细介绍如何在 PyQt5 中使用 QThread 进行多线程编程&#xff0c;学习如何避免界面冻结和线程安全问题&#xff0c;并通过丰富的案例来展示如何实现这些功能。 Q…...

uniapp小程序上传pdf文件

<template><view class"mainInnBox"><view class"formBox"><!-- 注意&#xff0c;如果需要兼容微信小程序&#xff0c;最好通过setRules方法设置rules规则 --><u-form :model"form" ref"uForm" :rules&quo…...

Python酷库之旅-第三方库Pandas(036)

目录 一、用法精讲 111、pandas.Series.item方法 111-1、语法 111-2、参数 111-3、功能 111-4、返回值 111-5、说明 111-6、用法 111-6-1、数据准备 111-6-2、代码示例 111-6-3、结果输出 112、pandas.Series.xs方法 112-1、语法 112-2、参数 112-3、功能 112-…...

Python爬虫(2) --爬取网页页面

文章目录 爬虫URL发送请求UA伪装requests 获取想要的数据打开网页 总结完整代码 爬虫 Python 爬虫是一种自动化工具&#xff0c;用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持&#xff08;如 requests、BeautifulSoup、Scrapy 等&#xf…...

【iOS】——探究isKindOfClass和isMemberOfClass底层实现

isKindOfClass 判断该对象是否为传入的类或其子类的实例 // 类方法实现&#xff0c;用于检查一个类是否属于另一个类或其父类链上的任何类。(BOOL)isKindOfClass:(Class)cls {// 从当前类开始&#xff0c;tcls将沿着元类的继承链向上遍历。for (Class tcls self->ISA(); …...

Python 热门面试题(七)

Python中如何拷贝对象&#xff1f;浅拷贝和深拷贝的区别是什么&#xff1f; 在Python中&#xff0c;拷贝对象是一个常见的需求&#xff0c;尤其是当你需要修改一个对象但又不想影响原始对象时。Python提供了几种拷贝对象的方法&#xff0c;其中最重要的是浅拷贝&#xff08;sh…...

STM32项目分享:智能宠物喂食系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com/video/BV1zy411z7…...

数据结构——栈的实现(java实现)与相应的oj题

文章目录 一 栈栈的概念:栈的实现&#xff1a;栈的数组实现默认构造方法压栈获取栈元素的个数出栈获取栈顶元素判断当前栈是否为空 java提供的Stack类Stack实现的接口&#xff1a; LinkedList也可以当Stack使用虚拟机栈&#xff0c;栈帧&#xff0c;栈的三个概念 二 栈的一些算…...

linux修改时区为CST

目录 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第一步&#xff1a; 备份原来的时区信息 [rootlocalhost ~]# mv /etc/localtime localtime.bak 第二步&#xff1a; 通过软链接将亚洲/上海 的时区信息 指导时区信息 [rootlocalhost ~]# ln -s /usr/share…...

【Spring Security】初识Spring Security

今天晚上因为一个项目问题&#xff0c;而正式开始学习Spring Security。 这个问题是“APP端的操作员应仅可查看管理后台的项目负责人分配给自己的计划”。 一、Spring Security的核心组件&#xff1a; Spring Security的核心组件包括&#xff1a;SecurityContextHolder、Auth…...

配置单区域OSPF

目录 引言 一、搭建基础网络 1.1 配置网络拓扑图如下 1.2 IP地址表 二、测试每个网段都能单独连通 2.1 PC0 ping通Router1所有接口 2.2 PC1 ping通Router1所有接口 2.3 PC2 ping通Router2所有接口 2.4 PC3 ping通Router2所有接口 2.5 PC4 ping通Router3所有接口 2.…...

SQL中的游标是什么?

在 SQL 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种用于遍历结果集的数据库对象。它允许开发者在 SQL 查询的结果集中逐行或逐批处理数据。 具体来说&#xff0c;SQL 中的游标通常用于以下目的&#xff1a; 遍历结果集&#xff1a;当一个 SQL 查询返回多行结果时…...

7. LangChain4j如何使用统一api调用?

前言 当我们对接LangChain4j的时候&#xff0c;面对复杂的各种各样的大模型的api的对接&#xff0c;让很多开发者感到力不从心。在每个大模型的api都不一样的时候&#xff1f;该如何快捷的切换模型的使用呢&#xff1f; 这时&#xff0c;One-API应运而生&#xff0c;它以其简洁…...

RPM、YUM 安装 xtrabackup 8 (mysql 热备系列一)包含rpm安装 mysql 8 配置主从

RPM安装 percona-xtrabackup-80-8.0.35-30.1.el7.x86_64.rpm 官网&#xff1a; https://www.percona.com/ 下载地址&#xff1a; https://www.percona.com/downloads wget https://downloads.percona.com/downloads/percona-distribution-mysql-ps/percona-distribution-mysq…...

maven项目打成可运行的jar及pom中的依赖一同打包

maven项目打jar及pom中的依赖一同打包 最近开发中有个需求&#xff0c;不部署新的服务&#xff0c;只jar包执行 那maven项目中&#xff0c;代码如何以jar的方式运行、如何把代码打成jar、pom中的依赖如何与代码一同打到jar包中&#xff1f; 1、代码如何以jar的方式运行&…...

Gettler‘s Screep World 笔记 Ⅰ

夏促时候刚刚入坑&#xff0c;写个笔记叭~ 环境配置 参考 HoPGoldy 大佬的简书&#xff0c;先配置下开发环境 萌新去看大佬的详细教程&#xff0c;我这里比较简单&#xff0c;有前端基础的可以直接抄 VSCode 跳过 node 我配的是v18.18.2 换源 npm config set registry h…...

联合体(union)的定义以及如何与结构体(struct)不同

联合体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;它允许在相同的内存位置存储不同的数据类型。但是&#xff0c;在任何给定的时间点&#xff0c;联合体只能存储其中的一个值&#xff1b;这意味着联合体的大小是其最大成员的大小&#xff0c;因为它必须足够…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...