| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> P3521 [POI2011]ROT-Tree Rotations -> 正文阅读 |
|
[数据结构与算法]P3521 [POI2011]ROT-Tree Rotations |
洛谷 P3521 [POI2011]ROT-Tree Rotations题目描述给定一颗有
n
n
n 个叶节点的二叉树。每个叶节点都有一个权值
p
i
p_i
pi?(注意,根不是叶节点),所有叶节点的权值构成了一个
1
~
n
1 \sim n
1~n 的排列。 输入格式第一行是一个整数
n
n
n,表示树的叶节点个数。
数据范围2 ≤ n ≤ 2 × 1 0 5 2 \leq n \leq 2 \times 10^5 2≤n≤2×105, 0 ≤ x ≤ n 0 \leq x \leq n 0≤x≤n,所有叶子节点是 1 ~ n 1 \sim n 1~n 的一个排列。 题解报告考虑用线段树合并解这道题。 首先每个题目在题目给定的树上每个节点开一颗权值线段树, 那么合并后,每个节点的权值线段树中应该包含以该节点为根的子树内所有叶子节点代表的数。 对题目所给定的树 d f s dfs dfs 一遍,用 a n s [ i ] ans[i] ans[i] 数组统计每棵子树内最小逆序对个数。 观察发现,左儿子与右儿子的交换并不影响其祖先节点的交换。 所以可以从低向上地贪心地求解, 即只要在 d f s dfs dfs 过程中每次合并都保证答案最小,那么最后得到的答案一定也是最小的。 合并给父亲节点时,我们分交换左右儿子节点和不交换两种情况, 记不叫唤时逆序对增加个数为 c 1 c1 c1,交换时逆序对增加个数为 c 2 c2 c2。 线段树合并过程中计算 c 1 c1 c1 和 c 2 c2 c2。 以上过程完毕后,更新当前节点 a n s [ i ] = a n s [ l s [ i ] ] + a n s [ r s [ i ] ] + m i n ( c 1 , c 2 ) ans[i] = ans[ls[i]] + ans[rs[i]] + min (c1, c2) ans[i]=ans[ls[i]]+ans[rs[i]]+min(c1,c2)。 至于如何计算 c 1 c1 c1 和 c 2 c2 c2,假设当前合并区间为 [ l , r ] [l, r] [l,r],合并的节点分别为 x x x, y y y。 则 c 1 + = n o d e [ l s [ y ] ] ? n o d e [ r s [ x ] ] c1 += node[ls[y]] * node[rs[x]] c1+=node[ls[y]]?node[rs[x]], c 2 + = n o d e [ l s [ x ] ] ? n o d e [ r s [ y ] ] c2 += node[ls[x]] * node[rs[y]] c2+=node[ls[x]]?node[rs[y]]。 (可以自己手动模拟理解下上面的式子)( n o d e [ i ] node[i] node[i]表示以节点 i i i 为根的子树内叶子节点个数) 最后输出 a n s [ 0 ] ans[0] ans[0],表示整颗子树内最小逆序对个数。 AC代码:
收获&总结需要一定思考才能写出来的,难度也不是很大,很适合用来练习和加深对算法的理解。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/25 21:12:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |