HDU 5967 小R與手機(動態樹)

2022-07-05 07:24:10 字數 1299 閱讀 9012

【題目鏈結】 

【題目大意】

給出一張圖,每個點僅連一條有向邊,或者不連,

要求查詢在可更改有向邊的情況每個點通過有向邊最終能到的終點,

如果是個環則輸出-1

【題解】

我們用lct維護,同時在每棵樹根結點的位置標記環,

因為出現環一定在根節點,否則的話只是換直接父節點而不成環,

對於換直接父節點的操作,我們看該樹的根是否有標記,

如果有則需要在cutf之後重新構建這棵樹的根,

如果換的父節點為自己的子節點,那麼就另成一棵樹並標記環,

【**】

#include #include #include using namespace std;

const int n=200010;

namespace link_cut_tree

bool isroot(int x)

void rev1(int x)

void pb(int x)

void rotate(int x)f[x]=f[y];f[y]=x;son[x][w^1]=y;

}void splay(int x)

rotate(x);}}

void access(int x)

// 查詢x所在的樹的根

int root(int x)

// 使x成為根

void makeroot(int x)

// 將x和y所屬樹合併

void link(int x,int y)

// 將x和其父節點分開

void cutf(int x)

// 將邊x-y切斷

void cut(int x,int y)

// 查詢x到y的鏈和

int ask(int x,int y)

// 計算x到y的xor和

int xorsum(int x,int y)

// 查詢節點到根的距離

int query(int x)

// 將x為下標的值改為y

int change(int x,int y)

// 將x的父親改為y

int changef(int x,int y)

}int mark[n];

void link(int x,int y)if(root(y)==x)mark[x]=y;

else changef(x,y);

}int n,m,op,x;

int main()

while(m--)else

}return 0;

}

hdu5967 小R與手機

用lct,不要mak eroo tmakeroot makero ot一棵樹的根節點可能是真的根節點 a root 0 a root 0 a roo t 0 也可能這個根節點還指向樹里的另乙個節點 這種情況下a r oot 0a root not0 a root 0 更改指向的時候,先切斷原來的邊,...

hdu小希的迷宮

上次gardon的迷宮城堡小希玩了很久 見problem b 現在她也想設計乙個迷宮讓gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有乙個通道連通了房間a和b,那麼既可以通過它從房間a走到房間b,也可以通過它從房間b走到房間a,為了提高難度,小希希望...

掃瞄線小整理 HDU1542 HDU1255

以前一直沒仔細學一波掃瞄線,最近終於補了一下。大致的思想 將座標的一維離散化,然後建立線段樹,維護當前被覆蓋的線段長度,然後將另一維排序,按順序插入線段樹。對於乙個矩形的上底邊和下底邊,如果從下往上掃瞄 則對下底邊作 1標記,上底邊作 1標記。用乙個結構體儲存一條邊的資訊,包括l 線段左端點,r 線...