| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 「JOISC 2017 Day 3」自然公园 题解 -> 正文阅读 |
|
[数据结构与算法]「JOISC 2017 Day 3」自然公园 题解 |
因为感觉网上题解很少,所以想来写一点感性+理性混合的题解qwq 而且犯了很多弱智错误) 考虑我们可以以以下形式确定每一条边: 我们维护一个包含0号节点的连通块 每次挑选一个点 x x x,满足 x x x 有和连通块直接相连的边 我们的任务就是:如何确定这样一条边? 直接扫肯定是不可接受的,所以我们采用二分的形式: 确定一个序(dfs/bfs)均可,然后在这个序上进行二分,二分出哪个前缀是满足联通的最小前缀(就是只包含这个前缀里的节点时,可以满足仍然有直接连边) 这样,前缀里的最后一个点,就是和这个点有直接连边的点 然后删去这个直接相连的点,会分出若干连通块,再检验 x x x 和这些连通块是否有直接连边 考虑为什么检验次数是对的,首先显然会有 M l o g n Mlogn Mlogn 次检验(不过这个log应该比较小) 然后考虑,删了一个点之后会分出若干连通块,就算立马返回,也要一次check 那么对于菊花来说,复杂度是否正确呢? 因为题目限制最多7条边,所以最多分出六个连通块,也就是总复杂度应该是 7 M l o g 7Mlog 7Mlog 鉴于很难每个点都跑到上届,所以可过) 那么另一个问题 我们如何找到一个 x x x 呢? 事实上 我们每次可以随机联块外一个点 x x x,随机的必要性在于防止被精心构造的数据多卡出一个 N l o g Nlog Nlog的check 然后对于这个 x x x 我们可以找到它和连通块之间的一点 y y y 但注意 我们应该标记连通块外的所有点,当以它去找路径中点的时候,应该把它删掉,理由有2: 1.他已经不可能成为其他的点的,路径上的必须点了(再搜完它前面的点之后 它会直接成为连通块,而它不可能成为它前面的点的必须点) 2.避免连通块之间胡搜,可能会出现(测试出的)连通块之间互搜的情况
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:54:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |