Sdoi2008 Cave 洞穴勘測

2021-08-26 11:24:51 字數 1170 閱讀 9666

bzoj好了以後去交了這題,算是動態樹補完

題目大意:

求一棵樹上任意兩點的連通性

這道題算是真真正正的link-cut tree了,之前的動態樹題目都沒有涉及link和cut操作

所以這道題讓我發現了我在寫cut過程中的乙個錯誤,也讓我更加深刻的體會到了link-cut tree的優美

對於修改,link cut即可

對於每個詢問,看他們是否在同一棵樹中

code:

//lib #include#include#include#include#include#include#include#include#include#includeusing namespace std; //macro #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i) #define rrep(i,a,b) for(int i=a,tt=b;i>=tt;--i) #define erep(i,e,x) for(int i=x;i;i=e[i].next) #define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++) #define read() (strtol(ipos,&ipos,10)) #define sqr(x) ((x)*(x)) #define pb push_back #define ps system("pause"); typedef long long ll; typedef pairpii; const int oo=~0u>>1; const double inf=1e20; const double eps=1e-6; string name="",in=".in",out=".out"; //var struct t tree[10008]; int n,m; void update(int x) } void zig(int x) void zag(int x) bool isroot(int x) void push_down(int x) void splay(int x) update(x); } void expose(int x)} void evert(int x) void link(int x,int y) void cut(int x,int y)} bool query(int a,int b) for(;rc(x);x=rc(x)); return x==b; } void work() } int main()

SDOI2008 洞穴勘測

lct維護連通性型別的題目,主要是要搞清楚findroot函式的作用 判斷根是否相同,和並查集裡面的find 函式有異曲同工之妙,如果根相同可以認為兩個點具有連通性。先access打通一道到x的實邊,現在x是深度最大的節點。然後再splay x到根節點,因為它深度最大,這個時候它只有左子樹。所以找它...

SDOI2008 洞穴勘測

輝輝熱衷於洞穴勘測 某天,他按照地圖來到了一片被標記為jszx的洞穴群地區 經過初步勘測,輝輝發現這片區域由n個洞穴 分別編號為1到n 以及若干通道組成 並且每條通道連線了恰好兩個洞穴。假如兩個洞穴可以通過一條或者多條通道按一定順序連線起來 那麼這兩個洞穴就是連通的,按順序連線在一起的這些通道則被稱...

SDOI2008 洞穴勘測 LCT

題目描述 輝輝熱衷於洞穴勘測。某天,他按照地圖來到了一片被標記為jszx的洞穴群地區。經過初步勘測,輝輝發現這片區域由n個洞穴 分別編號為1到n 以及若干通道組成,並且每條通道連線了恰好兩個洞穴。假如兩個洞穴可以通過一條或者多條通道按一定順序連線起來,那麼這兩個洞穴就是連通的,按順序連線在一起的這些...