Count on a Treap

题目来源

Codechef Feb 2014 COT5
https://www.codechef.com/problems/COT5

问题提出

什么是Treap

  • 是一颗二叉搜索树,每个节点拥有keykeykey属性.
  • 是一颗堆,每个节点拥有weightweightweight属性

问题

  • nnn次操作,三种类型,要求维护"大根Treap"

    • (0,k,w)(0,k,w)(0,k,w) ,插入keykeykey为k,weightk,weightk,weight为www的点.
    • (1,k)(1,k)(1,k),删除keykeykey为kkk的点
    • (2,ku,kv)(2,k_u,k_v)(2,ku​,kv​),询问keykeykey为ku,kvk_u,k_vku​,kv​的两点在TreapTreapTreap中的距离.

保证keykeykey,weightweightweight均不相同.

问题解答

dist(u,v)=dep(u)+dep(v)−2∗dep(lca)dist(u,v) = dep(u) + dep(v) - 2* dep(lca)dist(u,v)=dep(u)+dep(v)−2∗dep(lca)

我们以keykeykey为下标,将这个树按中序遍历展开.

显然[ku,kv][k_u,k_v][ku​,kv​]之间最大的weightweightweight最大的点就是两点的lcalcalca.

证明:首先lcalcalca一定在区间[ku,kv][k_u,k_v][ku​,kv​]之间,不然ku,kvk_u,k_vku​,kv​将位于lcalcalca的同一侧,这不可能.其次权重最大的点一定是这颗子树的根节点,这个点一定是祖先,如果它不是lcalcalca的话,那么它的keykeykey将大于或小于lcalcalca形成的子树中所有的点的keykeykey,也就是说它不在区间[ku,kv][k_u,k_v][ku​,kv​]之间,矛盾.

至此,用线段树可以轻松维护lcalcalca.

那么如何维护一个点在树上的深度呢?

根据Treap的特殊性质,我们知道每个点的weightweightweight一定小于他父亲的weightweightweight.

从这个点到根节点的祖先链上的weightweightweight是不断递增的.

这里有一个非常特殊的性质,在序列上就是从这个点往两侧各找一个直接的递增子序列,那么序列上的点都是他的祖先.

这个性质基于这样一个事实:每个点左右两侧的第一个大于它weightweightweight的点,都是这个点的一个祖先.因为其中一个点是它的父亲,而另一个点…自己画图观察一下就好了.

因此两个递增序列的长度和就是它到根的距离.

如何维护某一个点向右的直接递增序列呢.也是使用线段树,参考我的另一篇博客,楼房重建.

线段树-Count on a Treap-神题相关推荐

  1. 数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

    普通的下标线段树 Count Color Hotel Transformation Tree Generator™ Count Color POJ2777 查询区间内颜色种类数,观察到颜色种类数只有3 ...

  2. codefores 786B. Legacy(最短路,线段树优化拆点,好题)

    题目链接 B. Legacy time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  3. CodeForces - 1295E Permutation Separation(线段树+二维偏序,好题)

    题目链接:点击查看 题目大意:给出一个1~n的排列,现在要求选择一个合适的分割点,将整个排列分为两个部分,要求通过适当的移动使得前半部分的所有数值都小于后半部分的数值,现在给出移动每个数字所花费的代价 ...

  4. P3919 【模板】可持久化数组(可持久化线段树/平衡树)(入门第一题)

    学习博客:http://www.cnblogs.com/flashhu/p/8297581.html 题目链接:https://www.luogu.org/problemnew/show/P3919 ...

  5. BZOJ-4811: [Ynoi2017]由乃的OJ (树链剖分 线段树维护区间操作值 好题)

    4811: [Ynoi2017]由乃的OJ Time Limit: 6 Sec  Memory Limit: 256 MB Submit: 366  Solved: 118 [Submit][Stat ...

  6. 线段树(区间修改)模板题 Luogu 2357 守墓人

    众所周知,线段树可以在O( log n)的时间内进行很多修改和查询的操作,应用很广. 线段树,顾名思义,是一个二叉树,但是每个节点,存的不是不是"数",而是一个"区间&q ...

  7. 洛谷P2073 送花 [2017年6月计划 线段树01]

    P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...

  8. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  9. 线段树区间扫描线超详解,一篇文章搞懂扫描线

    怨念 这个专题其实不难,但是翻了一圈网上的博客,写得是云里雾里,我打算用一篇博客把它讲明白 前序知识 能看懂这篇文章需要: 线段树基础知识. 线段树染色问题基本概念. 离散化操作 目标 首先这个扫描线 ...

最新文章

  1. 强化学习(八) - 深度Q学习(Deep Q-learning, DQL,DQN)原理及相关实例
  2. Interview QA - 房间里有三盏灯,屋里有三个开关分别控制这三盏灯。如何只进入房间一次就知道哪一个开关控制哪一盏灯?
  3. 防止Entity Framework重复插入关联对象
  4. netty系列之:轻轻松松搭个支持中文的服务器
  5. poi 默认2位小数_odoo小数精确度
  6. Win7系统隐藏文件恢复的方法
  7. 《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一1.1 计算机科学和工程的课程体系及职业发展...
  8. python3 函数注意要点
  9. [jQuery基础] jQuery动效案例(二) -- 图标特效、无限循环滚动(简易轮播图)
  10. C++类成员函数的传参问题
  11. 多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间
  12. Windows Server 2008 R2的教程36篇!
  13. 设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!!
  14. c语言知识点总完整版pdf,C语言知识点总结 重点版.pdf
  15. mac连接Linux工具推荐,mac最值得关注的终端工具,你知道几个?
  16. 高速服务器充电桩位置,最全高速服务区充电站汇总,再也不担心过年回家趴半路啦!...
  17. 服务器 ssd虚拟内存,ssd虚拟内存设多大
  18. 【企业微信SCRM系统】如何通过企业微信接受个人微信好友申请?
  19. python io多路复用
  20. python 报错:No connection adapters were found for '%s' % url)

热门文章

  1. python没有菜单栏怎么搞mac_Mac 下 sublime 怎么调出顶端菜单栏
  2. mysql从库夯住_MySQL从库维护经验分享
  3. [JavaWeb-JavaScript]JavaScript概念与功能
  4. [Java基础]反射概述
  5. [剑指offer]面试题13:在O(1)时间删除链表结点
  6. strcmp()字符串比较函数
  7. oracle实现序列,oracle中创建序列和自增长列的实现方式
  8. C语言 ---文件读取
  9. 数据结构---前序和中序遍历的二叉树序列还原二叉树
  10. C++ 快速排序算法