[ARC183D] Keep Perfectly Matched

news/2024/9/20 23:29:41/文章来源:https://www.cnblogs.com/WrongAnswer90/p/18380150

My Blogs

[ARC183D] Keep Perfectly Matched

这场不打感觉亏麻了,怎么大家都不会 D。首先匹配路径长度之和最大,很典的想到取重心,猜测答案上界 \(\sum_i dep_i\) 可以取到。

取完重心之后,希望不断把两个不同的子树里的点进行匹配,直到删空。因为原树本身存在完美匹配,所以找一对不同子树里的点删去后,根节点的匹配一定变了。

所以选的点一定有一个在根节点当前的匹配点的子树里,否则根节点没有理由更改匹配点。设这个点为 \(x\),则 \(x\) 一定满足:其到根的路径上,边的种类是“匹配边,非匹配边,匹配边...”,即:

image.png

图中标 \(1\) 的边是匹配边,可以发现删六号点是合法的,而删 \(8\) 号点的过程中会因为连续出现了两条非匹配边而寄掉。

这样确定了一个子树中的点,另一个点是可以任意选的。因为要尽量匹配对,所以另一个点应该选在除此之外的 \(siz\) 最大的子树里面。接下来根的匹配就是选的第二个子树中的根节点。继续做上述过程即可。

这样做为何能取到最优值:设 \(x\) 是根的初始匹配节点,首先第一次删点的两棵子树一定分别是 \((x,y)\),然后第二次因为此时根和 \(y\) 匹配,所以要删 \((y,z)\),以此类推,可以发现除了开始的 \(x\) 删了一个点,剩下的操作都是,选一个子树删两个点,然后跳到另一棵子树。

除了 \(x\) 子树大小是奇数,剩下的子树大小都是偶数,一开始 \(x\) 删了 \(1\) 就全部变成了偶数。所以不会有奇偶性不对的情况。如果跳到另一棵子树选择当前 \(siz\) 最大的,那就一定能够删空。因为此时根是树的重心,每个子树内需要的操作次数大小都不会超过 \(\frac m 2\),其中 \(m\) 是总操作次数,所以这样做一定不会爆掉。

现在的问题就是如何高效的找出当前能删掉的合法点。策略也很简单:对于点 \(x\) 来说,如果初始他的匹配是他的父亲,则他儿子可以按任意顺序一个一个删光。

如果初始他的匹配是他的某个儿子,则先把这个儿子全部删空时最优的。然后他的匹配就变成了他的父亲,他剩下的儿子可以任意排列。

可以 \(\text{dfs}\) 求出每个子树的后序遍历,如果有某个儿子和他匹配就优先向这个儿子走,这样可以求出每个点的合法操作序列。然后套用上述过程,总复杂度 \(\mathcal O(n\log n)\) 或者 \(\mathcal O(n)\)

int n,rt,minn=inf,len,ans[500010],siz[250010];
vi T[250010],ve[250010];
void findrt(int x,int fa=0)
{int maxn=0;siz[x]=1;for(auto to:T[x])if(to!=fa)findrt(to,x),siz[x]+=siz[to],Mmax(maxn,siz[to]);if(Mmin(minn,max(n-siz[x],maxn)))rt=x;
}
void dfs(int x,int fa,int top)
{ve[top].eb(x);for(auto to:T[x])if(to!=fa&&to!=(((x-1)^1)+1))dfs(to,x,top);if(fa!=(((x-1)^1)+1))dfs(((x-1)^1)+1,x,top);
}
priority_queue<pii> q;
inline void mian()
{read(n);int x,y;pii p;for(int i=1;i<n;++i)read(x,y),T[x].eb(y),T[y].eb(x);findrt(1),findrt(rt);for(auto to:T[rt])dfs(to,rt,to);int pos=((rt-1)^1)+1;ans[++len]=ve[pos].back(),ve[pos].pop_back(),--siz[pos];for(auto to:T[rt])q.e(mp(siz[to],to));for(int I=1;I<(n>>1);++I){if(q.top().se==pos)p=q.top(),q.pop();else p=mp(-1,-1);pos=q.top().se;ans[++len]=ve[pos].back(),ve[pos].pop_back();ans[++len]=ve[pos].back(),ve[pos].pop_back();siz[pos]-=2;q.pop(),q.e(mp(siz[pos],pos));if(p.fi!=-1)q.e(p);}for(auto to:T[rt])if(siz[to])ans[++len]=to;ans[++len]=rt;for(int i=1;i<=len;i+=2)write(ans[i],' ',ans[i+1],'\n');
}

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

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

相关文章

触想强固型工业显示器加速海上油气勘探开发

石油作为现代工业发展的主要能源,已成为国际间政治、经济博弈的重要工具。一、行业发展背景过去百年间,人类对陆地油气资源的勘探开发逐渐趋于饱和,而面对持续增长的全球能源需求,海洋勘探已成为当今油气能源角逐的主要“战场”,进一步催生出对先进的自动化海上钻井系统的…

Win11减少C盘占用及清爽系统配置教程

Win11减少C盘占用及清爽系统配置教程你是否有过C盘爆满而不得不重装系统的经历?你是否有过因为C盘爆满而不得不不断的拓展空间的无奈?你是否有过已经将软件安装在D盘但C盘的空间还是在日益变满的痛苦?好消息好消息!!!今天你看到了这篇文章从此就可以最大程度的告别C盘爆满…

浏览器启动首页被360篡改

可能原因: (一)浏览器快捷方式被篡改 (二)浏览器启动程序的启动行为被360监听,执行启动浏览器过程中被360进行篡改 解决方案一(edge为例):查找edge浏览器的安装路径: 右击edge浏览器-> 属性-> 快捷方式-> 起始位置删除桌面的edge快捷图标将edge安装路径的 ms…

应用如何快速实现云原生化?华为云DTSE解读关键策略

本文分享自华为云社区《DTSE Tech Talk | 第64期:DTSE与开发者同行,探索云原生实践,共筑高效云优化之路》,作者:华为云社区精选。 在主题是《DTSE与您同行,探索云原生实践,共筑高效云优化之路》的直播活动中👉(点击观看),华为云云原生DTSE技术布道师王逸真,与开发…

redis 注册windows服务自启动

一:注册服务 每次重启服务器都得重启电脑,还得输入一大串运行redis太过于麻烦,查了下,可以设置开机自动启动。 方法如下: 1、首先,win+R,运行 cmd。 2、打开对应的redis文件夹。 3、输入redis-server --service-install redis.windows.conf会弹出类似提示; 4、再次 win…

winform 使用CefSharp嵌套Chromium内核浏览器

1、新建winform 项目.net frame4.8 2、nuget安装CefSharp.WinForms 版本84.4.103、debug模式修改为x86(重要)

spring boot 整合spring cloud config配置中心

创建2个项目springboot-cloud-config(作配置中心) springboot-cloud-client(客户端)springboot-cloud-config(工程) 注意:2个项目springboot版本:2.4.0 添加依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-…

Butterfly 主题美化之旅:从绚烂回归质朴

在追求完美的过程中,我们往往会陷入一个误区——过度美化博客主题,以至于忘记了博客最核心的价值所在:内容本身在这个充满各种可能的时代,博客不仅是个人展示才华与知识的窗口,也是技术爱好者分享经验、记录成长的平台。对于许多博主来说,博客的主题不仅仅是简单的视觉呈…

效率神器!一款方便、快捷的数据库文档查询、导出工具!

SmartSQL —— 一款方便、快捷的数据库文档查询、导出工具!这款工具不仅支持数据库文档导出,还支持SQL查询、代码生成、结构比较、数据分组、工具箱等功能。大家好,我是 Java陈序员。 之前给大家推荐过一款简洁好用的数据库表结构文档生成器。 永不生锈的螺丝钉!一款简洁好…

2-网络攻击原理与常用方法

2.1 网络攻击概述 1)概念 :指损害网络系统安全属性的危害行为。 危害行为导致网络系统的机密性、完整性、可用性、可控性、真实性、抗抵赖性等受到不同程度的破坏。 常见的危害行为有四个基本类型:信息泄漏攻击 完整性破坏攻击 拒绝服务攻击 非法使用攻击自治主体:攻击者初…

PWM脉冲宽度调制

PWM脉冲宽度调制 PWM简单来说就是通过调节mos管的开通关闭的占空比,进而调节输出的电压,所以又叫脉冲宽度调制。电脉冲,高低电平占比,脉冲宽度调制,就是利用控制供电时长来控制器件。 脉冲宽度调制(PWM)是一种数字调制技术,它通过调整方波信号的高电平持续时间(即脉冲…

揭开脸谱看封神:前言

嘿哟,您瞧瞧,任何一个民族的起源,那都得有段神奇的神话故事。咱汉族也不例外,神话故事一堆一堆的。咱这靠文化在东亚称霸几千年的民族,神话故事的著作那简直多得像星星,数都数不过来。可要是在大街上随便拉个人问问,中国古代神话故事书都有啥?估计最多被提到的就是《封…