Count on a tree 树上主席树
Count on a tree 树上主席树 给 \(n\) 个树,每个点有点权,每次询问 \(u,v\) 路径上第 \(k\) 小点权,强制在线 求解区间静态第 \(k\) 小即用主席树。 树上主席树类似于区间上主席树,我们利用前缀和相减获得区间的信息,树上主席树也是这样,维护一个到根节点的前缀和。对于 \((u,v)\) 路径, \(sum[u]+sum[v]-sum[lca(u,v)]-sum[fa[lca(u,v)]]\) 即可获得树上 \(u,v\) 路径的区间信息,然后按照区间查询即可。 #include <cstdio> #include <algorithm> #define MAXN 1001000 #define MAXM MAXN*30 #define LOG 30 int head[MAXN],nxt[MAXN*2],vv[MAXN*2],tot; inline void add_edge(int u, int v){ vv[++tot]=v; nxt[tot]=head[u]; head[u]=tot; } int n,m,s,cnt; int f[MAXN][31],dep[MAXN]; int rot[MAXN]; int val[MAXN],idx[MAXN]; int tre[MAXM],sl[MAXM],sr[MAXM]; void build