线段树动态开点+树链剖分BZOJ4999
以每个一个颜色开一颗线段树,内部以dfs序作为线段树节点,权值代表出现次数,维护线段树区间和 #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<map> using namespace std; const int maxn = 2e5+6; struct edge{ int next,to; }e[maxn*2]; struct node{ int l,r; int w; }tree[maxn*50]; int head[maxn],siz[maxn],top[maxn],son[maxn]; int d[maxn],fa[maxn],id[maxn],rk[maxn],dfn[maxn],c[maxn]; int n,m,uu,vv,tot,cnt; int rt[maxn]; map<int,int>p; void add(int x,int y){ e[++cnt].next=head[x]; e[cnt].to=y; head[x]=cnt; } void dfs1(int u,int f,int depth){ d[u]=depth; fa[u]=f; siz[u]=1; for (int i=head[u];i;i=e[i].next){ int v