【CF】团队训练赛1 J-Mex Tree 题解

news/发布时间2024/5/15 15:58:56

传送门:Takeout Delivering
标签:并查集

题目大意

给出一棵有n个点的树,编号分别为1,2,…,n,且这些点的权值为0~n-1的一个排列。现在对于k=0,1,…,n,你要找出找出一个连通子树,使得其中各点权值的mex值为k,且该连通子树在所有满足要求的连通子树中点数最多。
输入:第一行一个正整数n(1<=n<=1e6),代表树的结点数。第二行n个非负整数,代表每个点的权值。接下来n-1行每行两个正整数,分别代表第i条边连接的两个点的编号。
输出:n+1个正整数,如果k=i时无解则输出0,否则输出所求连通子树的点数的最大值。

算法分析

  • 首先我们要知道mex的含义,即一个集合中没出现过的最小非负正整数。现在要找一个点权mex值为k的连通子树,那就要保证权值为0~k-1的所有的点都出现在这棵树中,且权值为k的点绝对不能出现在这棵子树中。先考虑暴力的做法,我们要保证所得的子树包含的点最多,就只能在原树中断一条边。这一点很好证明,因为如果你断了两条边,就会将原树分成三个子树,已知其中一个0到k-1,一个子树包含k,那么剩下那个子树连接到哪就无关紧要,显然连接到所求的树中是最优解。
  • 也就是说我们只要暴力枚举断哪条边再统计断开后的两个子树中包含的点权就能知道答案,但是这种做法肯定是会超时的。不过我们在写朴素做法的同时发现了一点,就是可以假设一个点为根节点,然后问题转化为求以各个点为根的子树所包含的点权区间与主树剩下部分点权的关系。既然mex值为k的子树中不能有权值为k的点,且点权取值范围为0~n-1,和k的范围一样,那我们完全可以反过来想,遍历到点权为x的点时就求k=x时的答案,这样只要跑一遍dfs就能解决问题了。
  • 这样一来我们就知道了判断无解的条件,当点权为x的点所连接的子树中没有哪个是包含1到x-1中所有数的话,说明k=x时无解,反之答案就是那个子树的大小。所以我们先要预处理出以1为主树根节点时每个点为子树根节点时树的大小,这里记作sz[x],则除去该子树后剩下的树大小为n-sz[x]。然后再利用树上启发式合并,就能在nlogn时间里跑遍每一个子树,然后再利用树状数组就能知道某子树中是否包含0到k-1中所有的数。用一个数组存下k=0,1,…,n-1时的答案,最后k=n时答案显然为n,直接输出即可。

代码实现

#include <iostream>
using namespace std;
#include <vector>
#define lowbit(x) (x)&(-x)
vector<int> g[1000010];
int n,son,mx,a[1000010],sz[1000010],wsn[1000010],cnt[1000010];
int LT[1000005];
int ans[1000010];
void update(int x,int d){x++;n++;while(x<=n){LT[x]+=d;x+=lowbit(x);}x--;n--;
}
int get(int l,int r){if(l>r)return 0;l++;r++;n++;int sum=0;l--;while(l){sum-=LT[l];l-=lowbit(l);}while(r){sum+=LT[r];r-=lowbit(r);}l--;r--;n--;return sum;
}
void dfs0(int x,int fa){sz[x]=1;for(auto &i:g[x])if(i!=fa){dfs0(i,x);if(sz[i]>sz[wsn[x]])wsn[x]=i;sz[x]+=sz[i];}
}
void cal(int x,int fa,int d){update(a[x],d);for(auto &i:g[x])if(i!=fa&&i!=son)cal(i,x,d);
}
void dfs1(int x,int fa,bool flag){for(auto &i:g[x])if(i!=fa&&i!=wsn[x])dfs1(i,x,0);if(wsn[x]){dfs1(wsn[x],x,1);son=wsn[x];}cal(x,fa,1);if(get(0,a[fa]-1)==a[fa])ans[a[fa]]=max(ans[a[fa]],sz[x]);if(get(0,a[x]-1)==0)ans[a[x]]=max(ans[a[x]],n-sz[x]);if(!flag){son=0;cal(x,fa,-1);}
}
int main(){int i,x;ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;for(i=1;i<=n;i++)cin>>a[i];for(i=2;i<=n;i++){cin>>x;g[x].emplace_back(i);g[i].emplace_back(x);}a[1000001]=1000001;dfs0(1,0);dfs1(1,1000001,1);for(i=0;i<n;i++)cout<<ans[i]<<' ';cout<<n;return 0;
}

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

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

相关文章

【面试题】谈谈MySQL的索引

索引是啥 可以把Mysql的索引看做是一本书的目录&#xff0c;当你需要快速查找某个章节在哪的时候&#xff0c;就可以利用目录&#xff0c;快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度&#xff0c;但是降低了增删改的操作效率&#xff0c;也提高了空间…

C/C++内存管理详解

目录 一、C内存分布 二、C语言与C内存管理方式 1、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 2、C中的内存管理方式&#xff1a;new/delete 三、operator new与operator delete函数 1、函数概念&#xff1a; 2、函数使用&#xff1a; 3、底层原理…

突破性创新:OpenAI推出Sora视频模型,预示视频制作技术的未来已到来!

一、前言 此页面上的所有视频均由 Sora 直接生成&#xff0c;未经修改。 OpenAI - Sora is an AI model that can create realistic and imaginative scenes from text instructions. 2024 年 2 月 16 日&#xff0c;OpenAI 发布 AI 视频模型 Sora&#xff0c;60 秒的一镜到底…

【计算机网络】网络基础知识

一. 网络发展史 独立模式&#xff08;单机模式&#xff09;&#xff1a;计算机之间相互独立&#xff0c;各自拥有独立的数据。 网络互连&#xff1a;将多台计算机连接在一起&#xff0c;完成数据共享。 随着时代的发展&#xff0c;越来越需要计算机之间进行互相通信&#…

JavaWeb——002JS Vue快速入门

目录 一、JS快速入门​编辑 1、什么是JavaScript?​编辑 2、JS引入方式​编辑 2.1、示例代码 3、JS基础语法 3.1、书写语法 3.2、变量​编辑 3.3、数据类型 3.4、运算符​编辑 3.5、流程控制语句​编辑 4、JS函数 4.1、第一种函数定义方式 function funcName(参数…

js设计模式:模板方法模式

作用: 父类定义一个整体的模板框架,将具体的方法行为定义到子类中。 模板方法主要是封装行为中的固定部分,同时允许子类对方法进行扩展 示例: //moba游戏原型设计方案class MobaGame{loadAssets(){return{heroList:this.heroList(),equipmentList:this.equipmentList(),maps…

CT图像中不同仿射剂量(单位:HU) 会对应人体不同的组织器官

CT图像中不同仿射剂量&#xff08;单位&#xff1a;HU&#xff09; 会对应人体不同的组织器官

【前端工程化面试题】webpack proxy的工作原理,为什么能解决跨域问题

在 webpack 的配置文件 webpack.config.js 中有一个配置项 devServer 里面有一个属性是 proxy&#xff0c;这里面可以配置代理服务器&#xff0c;解决跨域问题&#xff0c;请参考官网。 一般来说 webpack 的代理就是说的开发服务器 webpack-dev-server。 其实不光是 webpack 其…

穿越科技的电影之旅:计算机专业必看的三部经典电影

文章目录 方向一&#xff1a;电影推荐方向二&#xff1a;技术与主题方向三&#xff1a;职业与人生 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨…

公司数据迁移,服务器小文件多复制慢解决方案

企业普遍面临一个挑战&#xff1a;如何高效地处理和移动大量的小型文件。这些文件虽然单个体积不大&#xff0c;但数量庞大&#xff0c;累积起来会占据极大的存储空间&#xff0c;而且在迁移过程中&#xff0c;复制这些文件的速度往往非常缓慢。这不仅影响了企业的运营效率&…

4.Spring MVC入门

文章目录 1. HTTP协议2. Spring MVC2.1. 三层架构2.2. MVC&#xff08;解决表现层的问题&#xff09;2.3. 核心组件 3. Thymeleaf3.1. 模板引擎3.2. Thymeleaf3.3. 常用语法 代码 1. HTTP协议 网址&#xff1a;https://www.ietf.org/ &#xff08;官网网址&#xff09; https:…

vue如何动态加载显示本地图片资源

在实际开发中&#xff0c;根据某一个变量动态展示图片的情况有很多。实现方法分打包构建工具的差异而不同。 1、webpack的项目 require引入图片资源 2、vite的项目 new URL(url,base).href 疑问解答&#xff1a;为什么vite项目不可以用require&#xff1f; 原因在于&#xf…

常见消息中间件

ActiveMQ 我们先看ActiveMQ。其实一般早些的项目需要引入消息中间件&#xff0c;都是使用的这个MQ&#xff0c;但是现在用的确实不多了&#xff0c;说白了就是有些过时了。我们去它的官网看一看&#xff0c;你会发现官网已经不活跃了&#xff0c;好久才会更新一次。 它的单机吞…

网络安全-pikachu之文件上传漏洞2

进入到第二个文件上传漏洞&#xff0c;发现名字是MIME type&#xff0c;并且查看前端源代码没发现限制&#xff0c;所以是后段&#xff0c;盲猜通过抓包就可以绕过后段限制。 先知道MIME type是什么&#xff0c;通过查找资料发现是&#xff1a;Content-Type是返回消息中非常重…

【代码随想录python笔记整理】第十二课 · 位置互换

前言:本笔记仅仅只是对内容的整理和自行消化,并不是完整内容,如有侵权,联系立删。 一、变量交换的实现 这节我们讨论一个简单的问题——怎么交换两个变量的值。比如说,一个瓶子里是水,一个瓶子里是油,想要将两个瓶子中的东西互换,我们应该怎么做呢?要实现上述过程,我们…

前端-游览器渲染原理

渲染 render vue react render 游览器渲染 html字符串 - > 像素信息 游览器是如何渲染页面的? 当游览器的网络线程收到 html文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程. 整…

notepad++运行python闪一下就没啦

问题&#xff1a;Notepad直接快捷键运行Python代码,出现闪一下就没了 解决措施&#xff1a; ①点击菜单运行(Run) --> 运行(Run)弹出的对话框 ②把 cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT 粘贴进入这个对话框内 ③点击保存&a…

C#串口 Modbus通讯工具类

一、安装Modbus包 二、创建modbushelper类 1、打开串口 public bool IfCOMOpend; //用于实例内的COM口的状态 public SerialPort OpenedCOM;//用于手动输入的COM转成SERIAL PORT /// <summary> /// 打开串口 /// </summary> /// <param name="COMname&quo…

总线中的match函数-笔记

嵌入式软件的bus_type 结构中的一个成员 .match 成员&#xff0c;是一个函数。用来在现有的设备驱动中匹配新插入的设备。匹配方式有4种(设备树、ACPI&#xff0c;id_tables, name)。 以platform总线为例&#xff0c;platform_bus_type 实例的match 为 platform_match, platfo…

QT_day2

1.思维导图 2.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff…
推荐文章