首页 > 其他分享 >CF1464F My Beautiful Madness

CF1464F My Beautiful Madness

时间:2023-07-20 17:23:21浏览次数:30  
标签:Beautiful CF1464F Madness 路径 father 子树 low 端点 lca

一发最优解祭(

Description

给定一棵树,节点 \(1\) 到 \(n\) 标号,\(q\) 个操作,你需要维护一个路径可重集合 \(P\),操作一共三种:

  1. 向 \(P\) 集合加入 \(u\to v\)。
  2. 在 \(P\) 集合中删掉 \(u\to v\)(保证操作之前有加入,并且只删一个)。
  3. 查询 \(P\) 集合中所有元素路径的 \(d\) 邻域的交集是否为空集。一条路径 \(p\) 的 \(d\) 邻域定义为所有到 \(p\) 距离不超过 \(d\) 的点组成的点集。

Solution

考虑到难以求出所有路径的 \(d\) 邻域交集,因为这个集合大小是 \(O(n)\) 的,考虑一个最优决策点 \(v\) ,使得这个点尽量能被 \(P\) 中最多的路径邻域覆盖到。

设 \(low\) 为 \(P\) 的元素路径中两个端点的 \(lca\) 深度最大的点,\(q\) 为这条路径,下证取 \(v=father_{d}(low)\) (即 \(low\) 的 \(d\) 级祖先)时最优。即题目原命题成立当且仅当 \(v\) 在这个邻域交集中。

考虑 \(p\in P\),分情况讨论:

首先如果 \(p\) 有点经过 \(v\),那显然是可以取的。

若 \(lca_p\in subtree(v)\) ,即 \(p\) 路径的 \(lca\) 在 \(v\) 的子树中,由 \(low\) 的深度最大的性质,显然有 \(dis(v,lca_p)\le d\)。

若 \(lca_p\notin subtree(v)\),则 \(q\) 和 \(p\) 必然不存在交集且 \(p\) 在 ,那此时决策点肯定尽量往上取,但是由于 \(low\) 的限制,\(v\) 的深度不能小于 \(dep_{low}-d\),那 \(v\) 取 \(low\) 的 \(d\) 级祖先是最优的。

所以我们可以维护出 \(low\)(具体可以使用 set 维护集合 \(P\) 所有路径 \(p\) 的 \(lca\)),然后求出 \(v=father_d(low)\),判断 \(v\) 是否合法。

由于上面证明了 \(p\in P\) 的 \(p\) 经过 \(v\) 或者在 \(v\) 的子树内都是合法的,那就考虑在 \(v\) 子树外的所有路径,它们到 \(v\) 的距离是否 \(\le d\),仍然分类讨论,令 \(u=father_d(v)=father_{2d}(low)\):

若有路径没有经过 \(u\) 的子树:说明这条路径在 \(u\) 的外部,那就不可能距离 \(v\le d\),直接判掉即可。

若所有路径都经过了点 \(u\) 的子树:那么只需要任意路径的 \(lca\) 到 \(v\) 的最长距离不超过 \(d\) 即可。因为 \(v\) 经过子树的路径一定满足,并且其它的路径一定是 \(lca\) 到 \(v\) 的距离最短。可以画图理解。

而这个最长距离可以用动态求子树直径解决,求出子树内以 \(lca(p)(p\in P)\) 为端点的最长路径 \(i\to j\),然后最长距离就是 \(\max\{dis(v,i),dis(v,j)\}\) 了。

判断是否所有路径都经过了某棵子树可以树上差分,对于一条路径 \(i\to j\),在 \(dfn_i,dfn_j\) 处 \(+1\),在 \(dfn_{lca(i,j)}\) 处 \(-1\),查询 \(u\) 子树和即可知道有多少条路径经过了 \(u\) 的子树。

然后动态求直径可以用线段树。基于一个基本结论:一个连通块 \(A\) 合并到另外一个连通块 \(B\) 上,新的直径端点必然在 \(A\) 直径端点、\(B\) 直径端点 \(4\) 个中取 \(2\) 个,于是对于每一段连续的 \(dfn\) 区间维护区间直径端点即可。

代码很好写,不放了。使用树剖求 \(father_k\),是 \(O(n\log^2 n)\) 的,但是如果换成欧拉序+ RMQ 的话可以达到 \(O(n\log n)\)。

标签:Beautiful,CF1464F,Madness,路径,father,子树,low,端点,lca
From: https://www.cnblogs.com/Ender32k/p/17568962.html

相关文章

  • urllib+BeautifulSoup爬取并解析2345天气王历史天气数据
    urllib+BeautifulSoup爬取并解析2345天气王历史天气数据网址:东城历史天气查询_历史天气预报查询_2345天气预报1、代码importjsonimportloggingimporturllib.parsefromdatetimeimportdate,datetimefromrandomimportrandintfromtimeimportsleepimportpymy......
  • AtCoder Beginner Contest 252 Ex K-th beautiful Necklace
    洛谷传送门AtCoder传送门不知道为什么可以想到设\(n_c\)为颜色\(c\)的出现次数,那么\(\prodn_c\)也即选的方案数\(\approx1.25\times10^{11}\)。发现\(B=\sqrt{\prodn_c}\)不大,考虑meet-in-the-middle,把所有颜色分成两部分,每一部分的\(\prodn_c\)都接近\(......
  • Educational Codeforces Round 150 (Rated for Div. 2) B. Keep it Beautiful
    #include<iostream>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],res[N];intt;intmain(){ cin>>t; while(t--){ intn; cin>>n; for(inti=0;i<n;i++){ cin>>a[i]; } intk=a[0]; res[0]=......
  • 形容女性漂亮的英文:beautiful、elegant、attractive、lovely、pretty
    形容女性漂亮的英文:beautiful、elegant、attractive、lovely、pretty。1、beautiful英[?bju:t?fl]美[?bjut?f?l]adj.美丽的,美好的;极好的;[例句]Shewasaverybeautifulwoman她是个大美女。2、elegant英[?el?g?nt]美[??l?ɡ?nt]adj.(人或其举止)优美的;漂亮的;简炼的;简洁的;[......
  • beautifulSoup找不到元素
    问题:页面F12可以定位元素,但把网页下载到本地,无法定位2种原因:1、内容在一个标签中,放在json字符串里 #内容在input里inputInfo=soup.find_all('input')[3]['value']#页面所有内容xmInfo=json.loads(inputInfo)Agency=xmInfo['author']xmContent=xmInfo['conte......
  • beautifulSoup查找元素常用汇总
    0、初始化:frombs4importBeautifulSouppageSource=driver.page_sourcesoup=BeautifulSoup(pageSource,'html.parser')1、标签名定位方法1:soup.body方法2:li.select('a')2、查找2.1、单个查找2.1.1、按text内容查找xmSoup.find(text=re.compile(......
  • Flex实践—So beautiful webpage.....
        前不久听说应该开始学习Flex,因为我的骨子里还是懒的,所以一直不想装这种专业软件,其实装软件配环境对我来说一直是比写代码还痛苦的事,今天下午终于赖不住无聊,下了个FlexBuilder3,装了一下,找了个注册码,开始感受它的神奇。。。。    让我惊讶的是Flex设计出来的页面效......
  • 爬虫框架有Scrapy、BeautifulSoup、Selenium
    爬虫框架有Scrapy、BeautifulSoup、Selenium BeautifulSoup比Scrapy相对容易学习。Scrapy的扩展,支持和社区比BeautifulSoup更大。Scrapy应被视为蜘蛛,而BeautifulSoup则是Parser。1.爬虫基础知识在开始Python爬虫之前,需要先掌握一些基础知识。首先了解一下HTTP协议,掌握常见的......
  • 【Python】Beautiful Soup
    简介BeautifulSoup对象我全部使用soup表示;BeautifulSoup简介:简单来说,BeautifulSoup是python的一个库,最主要的功能是从网页抓取数据。1、创建BeautifulSoup对象1.1soup.prettify()frombs4importBeautifulSouphtml_content="""<html><head><title>TheDor......
  • A. Make it Beautiful - 构造 + 数学
    题意:给定一个单调递增的数组,是否能通过任意调整顺序使对任意一个元素a[i]满足a[i]!=a[1]+a[2]+a[3]+...+a[i-1],如果能,输出“YES”并输出修改后的数组;如果不能输出“NO”。分析:如果数组元素都相等则一定不能满足条件,由于数组单调递增,所以只需要把a[1]后面的元素从大到小......