有乙個樹,點有權值,要你維護一些操作。
把兩點間的路徑中的點的點權都加乙個值或者詢問和。
把乙個點對應的子樹中點的點權都加乙個值或者詢問和。
根給出,輸出的和對乙個給出的數取模。
這道題也是樹鏈剖分的模板題,之前寫過一道,樹鏈剖分怎麼做就不寫了。
——>點這裡看<——
那就可以了。
記得取模。
#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 結點最短路徑上所有節點的值之和。操...