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

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

生活随笔

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

编程问答

Link Cut Tree学习笔记

發(fā)布時(shí)間:2024/8/26 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Link Cut Tree学习笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

捋一下思路

模板題:https://www.luogu.org/problemnew/show/P3690

推薦LCT的教程,個(gè)人認(rèn)為很詳細(xì),本文做了部分引用:https://www.luogu.org/blog/flashblog/solution-p3690

前置知識(shí):Splay

LCT是一種動(dòng)態(tài)樹(shù),支持連邊和斷邊,還有樹(shù)上路徑的查詢

LCT似乎是用Splay維護(hù)深度,這點(diǎn)知道了會(huì)感覺(jué)好理解一些

重要的操作有:

  • access(x),將x到根節(jié)點(diǎn)的路徑上的邊都變成重邊。循環(huán)處理,只有四步——轉(zhuǎn)到根;換兒子;更新信息;當(dāng)前操作點(diǎn)切換為輕邊所指的父親,轉(zhuǎn)第一步

  • makeroot(x),將x變?yōu)樗赟play的根節(jié)點(diǎn)。access操作后x變成Splay內(nèi)深度最大的點(diǎn),然后像Splay一樣把x轉(zhuǎn)上去

  • findroot(x),找所在樹(shù)的原根。不停找左兒子,因?yàn)樽髢鹤泳S護(hù)的深度比當(dāng)前節(jié)點(diǎn)小。

  • split操作。把一個(gè)點(diǎn)轉(zhuǎn)到根節(jié)點(diǎn),原路徑就是另一個(gè)點(diǎn)到根節(jié)點(diǎn)的路徑。然后把下面的點(diǎn)轉(zhuǎn)上去更新答案。

  • link(x, y),使x的父親指向y,連一條輕邊。如果在同一棵樹(shù)則不連邊

  • cut(x, y),使x和y斷邊。使x為根后,y的父親一定指向x,深度相差一定是1。當(dāng)access(y),splay(y)以后,x一定是y的左兒子,直接雙向斷開(kāi)連接。如果不一定存在該邊,先判一下連通性(注意findroot(y)以后x成了根),再看看x,y是否有父子關(guān)系,還要看y是否有左兒子(因?yàn)橐部赡躽的父親還是x,那么其它的點(diǎn)就在y的左子樹(shù)中)。

  • #include <bits/stdc++.h> #define root 0using namespace std;const int maxn = 300010;struct LCT { // 其實(shí)struct Splay會(huì)更好QAQint son[2], fa, val, s;bool tag; }t[maxn]; int st[maxn];bool isroot(int x) {return t[t[x].fa].son[0] == x || t[t[x].fa].son[1] == x; } // 判斷節(jié)點(diǎn)是否是一顆Splay的根,如果是的話返回值是false,不是返回值是true(其實(shí)改成not_root會(huì)更好一些QAQ)void pushup(int x) {t[x].s = t[t[x].son[0]].s ^ t[t[x].son[1]].s ^ t[x].val; }void reverse(int x) {swap(t[x].son[0], t[x].son[1]);t[x].tag ^= 1; }void pushdown(int x) {if(t[x].tag) {if(t[x].son[0]) reverse(t[x].son[0]);if(t[x].son[1]) reverse(t[x].son[1]);t[x].tag = 0;} }void rotate(int x) {int fa = t[x].fa, grandfa = t[t[x].fa].fa, s = t[fa].son[1] == x, tmp = t[x].son[s ^ 1];if(isroot(fa)) {t[grandfa].son[t[grandfa].son[1] == fa] = x;}t[x].son[s ^ 1] = fa;t[fa].son[s] = tmp;if(tmp) {t[tmp].fa = fa;}t[fa].fa = x;t[x].fa = grandfa;pushup(fa); }void pushdown_all(int x) {if(isroot(x)) pushdown_all(t[x].fa);pushdown(x); }void splay(int x) {int fa, grandfa;pushdown_all(x);while(isroot(x)) {fa = t[x].fa, grandfa = t[fa].fa;if(isroot(fa)) rotate((t[fa].son[0] == x) ^ (t[grandfa].son[0] == fa) ? x : fa);rotate(x);// cout << x << " " << fa << " " << grandfa << endl;}pushup(x); } // 以上是splay部分

    下面是LCT部分:

    inline void access(int x) {for(register int y = root; x; y = x, x = t[x].fa) {// cout << "QAQ" << endl;splay(x);t[x].son[1] = y;pushup(x);// cout << "QAQ" << endl;} } // 將該節(jié)點(diǎn)到該節(jié)點(diǎn)所在Splay的根節(jié)點(diǎn)上的所有路徑都變?yōu)橹剡卛nline void makeroot(int x) {access(x); splay(x);reverse(x); } // 將一個(gè)節(jié)點(diǎn)變成所在Splay的根inline int findroot(int x) {access(x); splay(x);while(t[x].son[0]) {pushdown(x);x = t[x].son[0];}splay(x);return x; } // 找到所在Splay的根節(jié)點(diǎn)inline void split(int x, int y) {makeroot(x);access(y); splay(y); } // 分離出x到y(tǒng)的路徑inline void link(int x, int y) {makeroot(x);if(findroot(y) == x) return ;t[x].fa = y; } // 連邊inline void cut(int x, int y) {makeroot(x);if(findroot(y) != x || t[y].fa != x || t[y].son[0]) return ;t[y].fa = t[x].son[1] = 0;pushup(x); } // 斷邊

    主程序:

    int main() {int n = read(), m = read();for(register int i = 1; i <= n; i++) {t[i].val = read();}while(m--) {int opt = read(), x = read(), y = read();if(!opt) {split(x, y);write(t[y].s), putchar(10);}if(opt == 1) {link(x, y);}if(opt == 2) {cut(x, y);}if(opt == 3) {splay(x);t[x].val = y;}}return 0; }

    轉(zhuǎn)載于:https://www.cnblogs.com/iycc/p/10440647.html

    總結(jié)

    以上是生活随笔為你收集整理的Link Cut Tree学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    主站蜘蛛池模板: 高h放荡受浪受bl | 国产又色又爽又黄 | 久久久av一区二区三区 | 欧美精品黑人 | 国产精品9999 | 少妇高潮av久久久久久 | 日韩精品一区在线播放 | 久久精品视频免费播放 | 精品国产一区二区三区四区精华 | 啪啪综合网 | 日本新japanese乱熟 | 国产女主播在线一区二区 | 精品福利一区 | 日本精品中文字幕 | 欧美xxxⅹ性欧美大片 | 国产视频第二页 | 日韩精品久久久久 | 久久精品噜噜噜成人88aⅴ | 香蕉网站在线观看 | 天天综合在线视频 | 91免费片 | 一区二区在线观看免费视频 | 性视频播放免费视频 | 欧美在线播放一区二区 | 欧美丰满熟妇bbb久久久 | 色人阁五月天 | 亚洲欧美一区二区三区久久 | 18禁男女爽爽爽午夜网站免费 | 日批视频免费在线观看 | 欧美黄页 | 欧美区亚洲区 | 淫辱的世界(调教sm)by | 美女上床网站 | 国内偷拍一区二区 | 在线观看二区 | 一区二区三区在线免费观看 | 木木影院| 小伸进喷水网站 | 国产极品美女在线 | 成人av影院在线观看 | 国产精品9 | 在线免费观看日韩av | 亚洲av毛片成人精品 | 日本视频二区 | 小小姑娘电影大全免费播放 | 欧美一区二区三区成人久久片 | 激情四射网 | 在线免费福利 | av55 | 免费高清av在线看 | 日韩一二三四五区 | 色戒在线免费 | 国产精品乱码久久久久 | 91高清国产 | 国产偷人妻精品一区二区在线 | 国产999久久久 | 奇米四色7777 | 欧美变态另类刺激 | 午夜影院0606 | 日色视频 | 激情视频在线播放 | 黄色福利社| 四虎精品一区二区三区 | 成年人在线播放 | va婷婷在线免费观看 | 午夜av一区 | 日韩手机在线视频 | 免费av看片 | 欧美图片第一页 | 色老头一区二区 | 精品性久久 | 亚洲欧美在线不卡 | 在线免费观看高清视频 | 狠狠久| 久久久久久福利 | 欧美日韩不卡一区二区三区 | 久久免费黄色 | 色视频免费在线观看 | 日韩精品电影一区二区 | 舔花蒂 | 精品欧美一区二区三区久久久 | 午夜精品久久久久久久蜜桃 | 久久久999精品视频 国产在线xx | 婷婷精品视频 | 精品美女 | 午夜在线不卡 | 你懂的在线免费观看 | 麻豆蜜桃91| 精品国产精品国产偷麻豆 | 亚洲一级二级三级 | 波多野结衣亚洲一区 | 久久成人a毛片免费观看网站 | 日韩毛片高清在线播放 | 欧美福利在线视频 | 丰满岳跪趴高撅肥臀尤物在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 在线观看日韩精品 | 爽爽视频在线观看 | 野外一级片 | 香蕉视频在线视频 |