Lca 樹上差分

2022-06-08 22:26:12 字數 993 閱讀 5380

暗の連鎖

\(\color\)

\(如圖, 如何使標記的邊的覆蓋次數+c ?\)

\(我們把邊權看成是其子樹下所有點權之和,如果我需要增加x到p與y到p之間的邊權,p=lca(x,y),\\那麼只需要將x標記為x+c,y標記為y+c,p標記為p-2c\)

\(做完以上的操作,最後對整個樹求一遍dfs即可,該過程模擬於求字首和\)

#include using namespace std;

#define io ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)

inline int lowbit(int x)

#define ll long long

#define pb push_back

#define pii pair#define x first

#define y second

#define inf 0x3f3f3f3f

const int n = 100010, m = 2 * n;

int n, m;

int h[n], e[m], ne[m], idx;

int depth[n], fa[n][17];

int d[n];

int q[n];

int ans;

void add(int a, int b)

void bfs() }}

}int lca(int a, int b)

return fa[a][0];

}int dfs(int u, int father)

}return res;

}int main()

bfs();

for (int i = 0; i < m; ++i)

dfs(1, -1);

cout << ans << '\n';

return 0;

}

暗 鎖 樹上LCA 樹上差分

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

acwing352樹上差分 lca

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

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

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