#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1e5;
const int M=N;
struct Edge {
int v,next;
Edge(int v=-1,int next=-1):v(v),next(next){}
}e[M*2];
int head[N],total;
void init(){
memset(head,-1,sizeof(head));total=0;
}
void adde(int u,int v){
e[total]=Edge(v,head[u]);head[u]=total++;
}
int dep[N],sz[N],fa[N],son[N];
void getson(int u,int f){///重儿子
dep[u]=dep[f]+1;sz[u]=1;fa[u]=f;son[u]=-1;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v==f)continue;
getson(v,u);
sz[u]+=sz[v];
if(son[u]==-1||sz[son[u]]<sz[v])son[u]=v;
}
}
int top[N],p[N],fp[N],pos;
void getpos(int u,int clo){////重链在p中连续
top[u]=clo;
p[u]=++pos;
fp[pos]=u;
if(son[u]==-1)return ;
getpos(son[u],clo);
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v!=son[u]&&v!=fa[u]){
getpos(v,v);
}
}
}
////////seg_tree;
void lca(int u,int v){
int fu=top[u],fv=top[v];
while(fu!=fv){
if(dep[fu]<dep[fv]){
swap(fu,fv);
swap(u,v);
}
///L=p[fu],R=p[u];update(1,pos,1);
u=fa[fu];fu=top[u];
}
if(dep[u]>dep[v])swap(u,v);
////L=p[u],R=p[v];update(1,pos,1);
}
void solve(){
pos=0;
dep[0]=0;
getson(1,0);
getpos(1,1);
}
int main(){
return 0;
}
树链剖分
最新推荐文章于 2025-04-11 09:14:49 发布