LCA模板解釋與樹上差分介紹

2021-09-21 07:12:55 字數 966 閱讀 5055

對於樹上求兩個節點的最小公共祖先,很明顯,可以通過從這兩個點一步步往上走,得到乙個相同的節點,那麼這個節點就是所要求的最小公共祖先了。但是,這種暴力,明顯會t。那麼,既然我們可以通過一步步往上爬,是不是也可以兩步兩步往上爬,三步三步,甚至一百步一百步呢?

記得杰倫有首歌叫《蝸牛》-----我要一步一步往上爬

既然有這樣一種一次往上爬多步的思想在了,那麼,距離一次是爬幾步呢?我們發現,所有的數都可以由任意個不同的2的冪次方組成,所以,可以每次往上爬不同的2的冪次方。這就是倍增求lca的主要思想了。這和st表思想一樣。

**:// 最終模板

#include using namespace std;

const int n=5e5+5,m=5e5+5;

int n,m,s,u,v,a,b;

int d[n],p[n][31];

int cnt,head[n];

struct edgee[m<<1];

inline void add(int u,int v)

inline void dfs(int u,int fa)

int main()e[n<<1];

inline void add(int u,int v)

void dfs(int u,int fa)

void dfs1(int u,int fa)

ans=max(ans,f[u]);

}int main()e[n<<1];

inline void add(int u,int v,int w)

void dfs(int u,int fa,int w)

void dfs1(int u,int fa)

ans=max(ans,f[u]);

}int main(){

//f[i]表示i節點的父親到i節點的距離

scanf("%d",&n);

for (register int i=1; i推薦題目:

Lca 樹上差分

暗 鎖 color 如圖,如何使標記的邊的覆蓋次數 c 我們把邊權看成是其子樹下所有點權之和,如果我需要增加x到p與y到p之間的邊權,p lca x,y 那麼只需要將x標記為x c,y標記為y c,p標記為p 2c 做完以上的操作,最後對整個樹求一遍dfs即可,該過程模擬於求字首和 include ...

暗 鎖 樹上LCA 樹上差分

傳說中的暗之連鎖被人們稱為 dark。dark 是人類內心的黑暗的產物,古今中外的勇者們都試圖打倒它。經過研究,你發現 dark 呈現無向圖的結構,圖中有 n 個節點和兩類邊,一類邊被稱為主要邊,而另一類被稱為附加邊。dark 有 n 1 條主要邊,並且 dark 的任意兩個節點之間都存在一條只由主...

acwing352樹上差分 lca

主要題意就是先給你乙個最小生成樹然後一些附加的邊 你要從最小生成樹里取一條邊 然後附加邊裡取一條 使 這個連通塊分成兩個連通塊 首先來看看樣例 三種取法 是圖中的三種顏色的取法法 如果圖變成這個樣子 要使圖從 1 2這條邊 變成兩個連通塊 你會發現 1 2 4 1 是乙個環 1 2 3 4 1又是乙...