luogu P3384 模板 輕重鏈剖分

2022-01-09 21:46:10 字數 2293 閱讀 2626

有乙個樹,點有權值,要你維護一些操作。

把兩點間的路徑中的點的點權都加乙個值或者詢問和。

把乙個點對應的子樹中點的點權都加乙個值或者詢問和。

根給出,輸出的和對乙個給出的數取模。

這道題也是樹鏈剖分的模板題,之前寫過一道,樹鏈剖分怎麼做就不寫了。

——>點這裡看<——

那就可以了。

記得取模。

#include#include#includeusing namespace std;

struct node e[200001];

int n, x, y, z, le[100001], kk, tot, q, root, mo;

int number[100001], top[100001], tree_pl[100001], normal_pl[400001];

int fa[100001], num[100001], deg[100001], son[100001];

long long sum[400001], sum, lazy[400001];

int op, size[100001];

void add(int x, int y) ; le[x] = kk;

}void dfs1(int now, int father)

}void dfs2(int now, int father)

for (int i = le[now]; i; i = e[i].nxt)

if (e[i].to != father && e[i].to != son[now])

}void up(int now)

void down(int now, int l, int r)

void build(int now, int l, int r)

int mid = (l + r) >> 1;

build(now << 1, l, mid);

build(now << 1 | 1, mid + 1, r);

up(now);

}void add_num(int now, int l, int r, int l, int r, int add__num)

down(now, l, r);

int mid = (l + r) >> 1;

if (l <= mid) add_num(now << 1, l, mid, l, r, add__num);

if (mid + 1 <= r)add_num(now << 1 | 1, mid + 1, r, l, r, add__num);

up(now);

}void query(int now, int l, int r, int l, int r)

down(now, l, r);

int mid = (l + r) >> 1;

if (l <= mid) query(now << 1, l, mid, l, r);

if (mid + 1 <= r) query(now << 1 | 1, mid + 1, r, l, r);

}void ask(int x, int y)

query(1, 1, tot, tree_pl[top[x]], tree_pl[x]);

x = fa[top[x]];

} if (deg[x] > deg[y]) swap(x, y);

query(1, 1, tot, tree_pl[x], tree_pl[y]);

}void insert(int x, int y, int z)

add_num(1, 1, tot, tree_pl[top[x]], tree_pl[x], z);

x = fa[top[x]];

} if (deg[x] > deg[y]) swap(x, y);

add_num(1, 1, tot, tree_pl[x], tree_pl[y], z);

}int main()

dfs1(root, 0);

tot = 1;

top[root] = root;

tree_pl[root] = 1;

normal_pl[1] = root;

dfs2(root, 0);

build(1, 1, tot);

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

else if (op == 2)

else if (op == 3)

else if (op == 4) }

return 0;

}

Luogu P3384 樹鏈剖分模板

樹鏈剖分的基本思想是把一棵樹剖分成若干條鏈,再利用線段樹等資料結構維護相關資料,可以非常暴力優雅地解決很多問題。樹鏈剖分中的幾個基本概念 重兒子 對於當前節點的所有兒子中,子樹大小最大的乙個兒子就是重兒子 子樹大小相同的則隨意取乙個 輕兒子 不是重兒子就是輕兒子 重邊 連線父節點和重兒子的邊 輕邊 ...

P3384 模板 輕重鏈剖分(樹鏈剖分模板)

入口 題目描述 如題,已知一棵包含 nn 個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作 11 格式 1 x y z1 x y z 表示將樹從 xx 到 yy 結點最短路徑上所有節點的值都加上 zz。操作 22 格式 2 x y2 x y 表示求樹從 xx 到 yy 結點最短...

P3384 輕重鏈剖分(樹剖模板)

如題,已知一棵包含 nn 個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作 11 格式 1 x y z1xyz 表示將樹從 xx 到 yy 結點最短路徑上所有節點的值都加上 zz。操作 22 格式 2 x y2xy 表示求樹從 xx 到 yy 結點最短路徑上所有節點的值之和。操...