洛谷4299首都(LCT維護動態重心 子樹資訊)

2022-05-25 14:30:10 字數 2298 閱讀 4240

這個題目很有意思

qwq根據題目描述,我們可以知道,首都就是所謂的樹的重心,那麼我們假設每顆樹的重心都是\(root\)的話,對於每次詢問,我們只需要\(findroot(x)\)就可以。

那麼如何處理\(link\)操作呢qwq

這裡是看了題解,我才知道是怎麼做的

大致的思想就是:

!啟發式合併!

首先,這裡需要注意樹的中心具有的兩個性質:

1。以這個點為根,那麼所有的子樹(不算整個樹自身)的大小都不超過整個樹大小的一半。

2.假設兩個聯通塊x和y進行合併,而且\(size(x)>size(y)\),那麼新的重心必然在連線原來兩棵樹重心的路徑上。

那麼我們對於一次\(link\),首先要知道兩棵樹的重心的路徑是什麼樣的,我們可以通過\(link+access\),然後中序遍歷來求出來

void dfs(int x,int lim)

pushdown(x);

if (ch[x][0]) dfs(ch[x][0],lim);

if (flag) return;

sta[++top]=x;

if (flag) return;

if (ch[x][1]) dfs(ch[x][1],lim);

if (flag) return;

}link(x,y);

access(x);

splay(ry);

dfs(ry,ymh);

一定記得\(dfs\)的時候要\(pushdown\)!!!

同時dfs的時候,如果路徑上的點已經要比,較小的子樹的size要大,就可以直接\(return\),因為繼續下去一定沒有意義,就不可能會更新答案了。

然後把這條路徑統計出來之後,我們只需要從\(root_大\)開始,看看當前的節點的子樹大小*2,是不是大於總的\(size\),如果大於,就移動,不然就\(break\)

int r = ry;

for (int i=1;i<=top;i++)

makeroot(r);

ans^=r;

大致就是這樣,然後對於整體的詢問,我們維護乙個\(ans\)即可,每次合併之前先異或上兩個\(root\),然後最後再異或一下最後合併完的\(root\)

上**

// luogu-judger-enable-o2

#include#include#include#include#include#include#include#include#includeusing namespace std;

inline int read()

while (isdigit(ch))

return x*f;

}const int maxn = 3e5+1e2;

int ch[maxn][3];

int fa[maxn],rev[maxn],st[maxn];

int n,m;

int sta[maxn];

int sum[maxn],xv[maxn];

int ans;

int son(int x)

bool notroot(int x)

void update(int x)

void reverse(int x)

void pushdown(int x)

}void rotate(int x)

void splay(int x)

rotate(x);

}update(x);

}void access(int x)

}void makeroot(int x)

int findroot(int x)

return x;

}void split(int x,int y)

void link(int x,int y)

}int q;

bool flag=false;

int top;

void dfs(int x,int lim)

pushdown(x);

if (ch[x][0]) dfs(ch[x][0],lim);

if (flag) return;

sta[++top]=x;

if (flag) return;

if (ch[x][1]) dfs(ch[x][1],lim);

if (flag) return;

}int main()

makeroot(r);

ans^=r;}}

return 0;

}

BZOJ3510 首都(LCT 啟發式Link)

題面 題意 乙個森林,兩個操作,連邊。問乙個連通塊的重心。由於它只有連邊,所以我們可以搞個類似啟發式的東西 考慮乙個小樹的u和一棵大樹的v連邊 重心一定打大樹裡面 設大樹的重心為ro 則新的重心一定在ro到v的路徑上 並且移動的步數不會超過小樹的siz 用lct維護子樹大小 evert ro acc...

2023年首都機場大巴路線時刻表

2008年首都機場大巴路線時刻表 2008 1 28 15 14 20 機場一線 車程 首班時間 末班時間 票價 經停站 間隔時間 西單民航大廈始發 06 00 19 30 16 西單,東直門 15分鐘 首都機場 東四美術館 07 30 當日航班結束 16 漁陽飯店,東直門,東四十條橋,朝陽門橋,雅...

2388 首都(曼哈頓距離與切比雪夫距離互轉)

在平面上有n個整點 橫縱座標都是整數 牛牛想找到乙個整點,使得這個點,到所有點的距離之和最小。兩個點的距離定義為從乙個點走到另乙個點的最小步數。其中每步可以走向相鄰8個點 上,下,左,右,左上,左下,右上,右下,類似西洋棋中的王 走一步。輸出這個最小的距離之和。和這個點選擇的方案數。即有多少個點,可...