QTREE

树链剖分水题
[https://www.bilibili.com/video/av4482146/]
DFS1

int dep[MaxN],fa[MaxN],son[MaxN],sz[MaxN];
void bfs1(int u,int pre,int d){
  dep[u] = d;
  fa[u] = pre;
  son[u] = -1;
  sz[u] = 1;
  for(int i = 0;i < G[u].size();++i){
    int &v = G[u][i];
    if(v == pre)  continue;
    dfs1(v,u,d+1);
    if(son[u] == -1 || sz[son[u]] < sz[v])  son[u] = v;
  }
}

DFS2


int id[MaxN],top[MaxN];
int tot;
void dfs2(int u,int sp){
  id[u] = ++tot;
  top[u] = sp;
  if(son[u] == -1)  return;
  dfs2(son[u],sp);
  int gusz = G[u].size();
  for(int i = 0;i < gusz;++i){
    int &v = G[u][i];
    if(v == fa[u] || v == son[u])  continue;
    dfs2(v,v);
  }
}

Find


int Find(int u,int v){
  int f1 = top[u],f2 = top[v];
  int tmp;
  while(f1 != f2){
    if(dep[f1] < dep[f2]){
      swap(f1,f2);swap(u,v);
    }
    tmp = max(tmp,query(1,id[f1],id[u]));
    u = fa[f1];  f1 = top[u];
  }
  if(u == v)  return tmp;
  if(dep[u] > dep[v])  swap(u,v);
  tmp = max(tmp,query(1,id[son[u]],id[v]));
  return tmp;
}
就是把树拆成多条链。

路径上的修改和查找都是沿着链进行!
路径上的修改和查找都是沿着链进行!
路径上的修改和查找都是沿着链进行!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 新的一年终于来临,我和爸爸妈妈弟弟一起回到陆丰老家,我老家可热闹了!我来为大家介绍一下我们的过年习俗吧。 ...
    陈增健阅读 2,732评论 0 0
  • 久闻道德二经,而望文生畏,惧读之。适才闲来无事,始读,颇以为趣。然恕愚驽钝,不解其意。遂寻各家所思,以求点化。愚之...
    ibenlai阅读 11,053评论 15 7