日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

线段树-Count on a Treap-神题

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线段树-Count on a Treap-神题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Count on a Treap

題目來(lái)源

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

問(wèn)題提出

什么是Treap

  • 是一顆二叉搜索樹(shù),每個(gè)節(jié)點(diǎn)擁有keykeykey屬性.
  • 是一顆堆,每個(gè)節(jié)點(diǎn)擁有weightweightweight屬性

問(wèn)題

  • nnn次操作,三種類(lèi)型,要求維護(hù)"大根Treap"
    • (0,k,w)(0,k,w)(0,k,w) ,插入keykeykeyk,weightk,weightk,weightwww的點(diǎn).
    • (1,k)(1,k)(1,k),刪除keykeykeykkk的點(diǎn)
    • (2,ku,kv)(2,k_u,k_v)(2,ku?,kv?),詢問(wèn)keykeykeyku,kvk_u,k_vku?,kv?的兩點(diǎn)在TreapTreapTreap中的距離.

保證keykeykey,weightweightweight均不相同.

問(wèn)題解答

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為下標(biāo),將這個(gè)樹(shù)按中序遍歷展開(kāi).

顯然[ku,kv][k_u,k_v][ku?,kv?]之間最大的weightweightweight最大的點(diǎn)就是兩點(diǎn)的lcalcalca.

證明:首先lcalcalca一定在區(qū)間[ku,kv][k_u,k_v][ku?,kv?]之間,不然ku,kvk_u,k_vku?,kv?將位于lcalcalca的同一側(cè),這不可能.其次權(quán)重最大的點(diǎn)一定是這顆子樹(shù)的根節(jié)點(diǎn),這個(gè)點(diǎn)一定是祖先,如果它不是lcalcalca的話,那么它的keykeykey將大于或小于lcalcalca形成的子樹(shù)中所有的點(diǎn)的keykeykey,也就是說(shuō)它不在區(qū)間[ku,kv][k_u,k_v][ku?,kv?]之間,矛盾.

至此,用線段樹(shù)可以輕松維護(hù)lcalcalca.

那么如何維護(hù)一個(gè)點(diǎn)在樹(shù)上的深度呢?

根據(jù)Treap的特殊性質(zhì),我們知道每個(gè)點(diǎn)的weightweightweight一定小于他父親的weightweightweight.

從這個(gè)點(diǎn)到根節(jié)點(diǎn)的祖先鏈上的weightweightweight是不斷遞增的.

這里有一個(gè)非常特殊的性質(zhì),在序列上就是從這個(gè)點(diǎn)往兩側(cè)各找一個(gè)直接的遞增子序列,那么序列上的點(diǎn)都是他的祖先.

這個(gè)性質(zhì)基于這樣一個(gè)事實(shí):每個(gè)點(diǎn)左右兩側(cè)的第一個(gè)大于它weightweightweight的點(diǎn),都是這個(gè)點(diǎn)的一個(gè)祖先.因?yàn)槠渲幸粋€(gè)點(diǎn)是它的父親,而另一個(gè)點(diǎn)…自己畫(huà)圖觀察一下就好了.

因此兩個(gè)遞增序列的長(zhǎng)度和就是它到根的距離.

如何維護(hù)某一個(gè)點(diǎn)向右的直接遞增序列呢.也是使用線段樹(shù),參考我的另一篇博客,樓房重建.

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的线段树-Count on a Treap-神题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。