线段树合并模板题
不说了直接代码分析
大佬的code
#include#include #include #include #include #include #include #include
蒟蒻的
有一点问题就是
权值线段树
貌似可以不用离散化
/*while(next second)++love_life;*/#include#define re return#define R register #define inc(i,l,r) for(register int i=l;i<=r;++i)using namespace std;template inline void rd(T&x){ char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x;}const int maxn=1e5+5,maxl=1e5;int n,m,k,hd[maxn],hide[maxn],X[maxn],Y[maxn],Z[maxn],a[maxn];int ans[maxn];struct node{ int to,nt;}e[maxn<<1];inline void add(int x,int y){ e[++k].to=y;e[k].nt=hd[x];hd[x]=k; e[++k].to=x;e[k].nt=hd[y];hd[y]=k;}struct tree{ int first[maxn],top,tot,cnt; int rab[maxn*30],rt[maxn*30],id[maxn*30],ls[maxn*30],rs[maxn*30],Max[maxn*30]; struct LL { int col,nt,op; }st[maxn<<2]; inline void insert(int x,int y,int z) //节点X染成y,+-z { st[++top].col=y;st[top].nt=first[x];first[x]=top;st[top].op=z; } inline int New() { int now; if(tot)now=rab[tot--]; else now=++cnt; ls[now]=rs[now]=Max[now]=0; re now; } inline void Throw(int x) { rab[++tot]=x; } inline void pushup(int rt) { if(Max[ls[rt]] >1; if(pos<=mid) Add(ls[rt],l,mid,pos,val); else Add(rs[rt],mid+1,r,pos,val); pushup(rt); if(!Max[rt]) id[rt]=0; } inline int merge(int l,int r,int x,int y) { if(!x||(!y))re x+y; if(l==r) { Max[x]+=Max[y]; Throw(y); re x; } int mid=(l+r)>>1; ls[x]=merge(l,mid,ls[x],ls[y]); rs[x]=merge(mid+1,r,rs[x],rs[y]); Throw(y); pushup(x); re x; } }T;struct LCA{ int fa[maxn],top[maxn],son[maxn],size[maxn],dep[maxn]; inline void dfs1(int x) { dep[x]=dep[fa[x]]+(size[x]=1); for(int i=hd[x];i;i=e[i].nt) { int v=e[i].to; if(v==fa[x])continue; fa[v]=x; dfs1(v); size[x]+=size[v]; if(size[v]>size[son[x]]) son[x]=v; } } inline void dfs2(int x,int topf) { top[x]=topf; if(son[x]) { dfs2(son[x],topf); for(int i=hd[x];i;i=e[i].nt) { int v=e[i].to; if(!top[v]) dfs2(v,v); } } } inline int Lca(int x,int y) { while(top[x]!=top[y]) { if(dep[top[x]]