暗の連鎖
\(\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。那麼,既然我們可以通過一步步往上爬,是不是也可以兩步兩步往上爬,三步三步,甚至一百步一百步呢?記得杰倫有首歌叫 蝸牛 我要一步一步往上爬 既...