參考部落格
妙wa
部落格上講的挺詳細的,也比較簡單易懂【樹鏈剖分】
感覺挺妙的,其實樹剖並不是很難,就是**有些繁瑣。
/*
* @author: zhl
* @date: 2020-10-13 20:36:59
*/#include#define rep(i,a,b) for(int i = a;i <= b;i++)
#define repe(i,u) for(int i = head[u];i;i = e[i].next)
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
const int n = 4e5 + 10;
int a[n];
int n, m, root, mod;
struct edge e[n << 1];
int head[n], tot;
void addedge(int from, int to) ;
head[from] = tot++;
}int fa[n], sz[n], tfa[n], dep[n], son[n];
//dfs1處理dep,sz,fa,son(重兒子)
void dfs1(int u, int p)
}int cnt;
int id[n], val[n], top[n];
//dfs2 剖分數鏈
void dfs2(int u, int topf)
}int sum[n << 2], lz[n << 2];
int x, y, z;
void push_down(int o, int l, int r)
void build(int o, int l, int r)
build(lo, l, mid);
build(ro, mid + 1, r);
sum[o] += sum[lo] + sum[ro];
}void updt(int o, int l, int r)
push_down(o, l, r);
if (x <= mid)updt(lo, l, mid);
if (y > mid)updt(ro, mid + 1, r);
sum[o] = (sum[lo] + sum[ro]) % mod;
}int query(int o, int l, int r)
int ans = 0;
push_down(o, l, r);
if (x <= mid)ans = (ans + query(lo, l, mid)) % mod;
if (y > mid)ans = (ans + query(ro, mid + 1, r)) % mod;
return ans;
}int query_path(int a, int b)
if (dep[a] > dep[b])swap(a, b);
x = id[a]; y = id[b];
ans = (ans + query(1, 1, cnt)) % mod;
return ans;
}void updt_path(int a, int b, int k)
if (dep[a] > dep[b])swap(a, b);
x = id[a]; y = id[b]; z = k;
updt(1, 1, cnt);
}int main()
dfs1(root, 0);
dfs2(root, root);
build(1, 1, cnt);
while (m--)
if (op == 2)
if (op == 3)
if (op == 4) }}
/*5 50 2 24000
7 3 7 8 0
1 21 5
3 14 1
*/
我debug
一晚上的罪魁禍首。
**一刻鐘,debug兩小時
bug 一字元
樹鏈剖分 模板
class match node a n struct no no aa n 4 void init void addpage int x,int y void dfs int s,int faa,int h 根節點,父節點和深度的 if max 0 son s sign void dfs2 int...
模板 樹鏈剖分
define maxn 50010 define l u u 1 define r u u 1 1 寫在類裡面爆棧 int n,m,q int tim 時間戳 int num maxn 樹上每個節點的初始值 int siz maxn siz u 表示以u為根的子樹的節點數 int top maxn ...
樹鏈剖分模板
點權模板 1 m a b c將節點a到節點b路徑上所有點都染成顏色c 2 q a b詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 const int n 100100 struct edge g n 2 int cnt,head...