首页 > 其他分享 >【模板】LCT

【模板】LCT

时间:2023-12-13 17:37:56浏览次数:31  
标签:LCT ch int siz void fa getson 模板

P4219 [BJOI2014] 大融合
template <int N>
struct LCT {
  int ch[N + 10][2], fa[N + 10];
  bool rev[N + 10];
  int sizl[N + 10], siz[N + 10];
  bool getson(int p) { return ch[fa[p]][1] == p; }
  bool nroot(int p) { return p && ch[fa[p]][getson(p)] == p; }
  void maintain(int p) {
    if (p) siz[p] = siz[ch[p][0]] + 1 + sizl[p] + siz[ch[p][1]];
  }
  // siz[p] 有效,当且仅当 p 被 makeroot 了
  void reverse(int p) {
    swap(ch[p][0], ch[p][1]);
    rev[p] ^= 1;
  }
  void pushdown(int p) {
    if (rev[p]) {
      reverse(ch[p][0]);
      reverse(ch[p][1]);
      rev[p] = false;
    }
  }
  void pushall(int p) {
    if (nroot(p)) pushall(fa[p]);
    pushdown(p);
  }
  void rotate(int p) {
    const auto link = [&](int p, int q, int r) {
      fa[p] = q, ch[q][r] = p;
    };
    int f = fa[p], r = getson(p);
    if (nroot(f))
      link(p, fa[f], getson(f));
    else
      fa[p] = fa[f];
    link(ch[p][r ^ 1], f, r);
    link(f, p, r ^ 1);
    maintain(f);
    maintain(p);
  }
  void splay(int p) {
    pushall(p);
    for (; nroot(p); rotate(p))
      if (nroot(fa[p])) rotate(getson(p) == getson(fa[p]) ? fa[p] : p);
  }
  int access(int p) {
    int y = 0;
    for (; p; y = p, p = fa[p]) {
      splay(p);
      sizl[p] -= siz[y];
      sizl[p] += siz[ch[p][1]];
      ch[p][1] = y;
      maintain(p);
    }
    return y;
  }
  void makeroot(int p) {
    access(p);
    splay(p);
    reverse(p);
  }
  void link(int x, int y) {
    makeroot(x);
    makeroot(y);
    fa[y] = x;
    sizl[x] += siz[y];
  }
  void cut(int x, int y) {
    makeroot(x);
    access(y), splay(y);
    fa[x] = ch[y][0] = 0;
    maintain(y);
  }
};

标签:LCT,ch,int,siz,void,fa,getson,模板
From: https://www.cnblogs.com/caijianhong/p/template-lct.html

相关文章

  • BugKu-Web-Flask_FileUpload(模板注入与文件上传)
    FlaskFlask是一个使用Python编写的轻量级Web应用框架。它是一个微型框架,因为它的核心非常简单,但可以通过扩展来增加其他功能。Flask的核心组件包括Werkzeug,一个WSGI工具箱,以及Jinja2,一个模板引擎。Flask使用BSD授权,这意味着它遵循开源许可证,允许用户自由地使用、修改和分发。Fla......
  • prometheus.rules模板
    groups:name:服务器告警rules:alert:服务器宕机告警expr:up==0for:3mannotations:summary:"Alerting{{$labels.instance}}宕机!"description:"环境{{$labels.job}}服务器{{$labels.instance}}已宕机!"alert:cpu使用率过高告警expr:(100-(avg(irate(node_c......
  • 实验6 模板类、文件I/O和异常处理
    实验任务1源代码:#pragmaonce#include<iostream>#include<stdexcept>//复数模板类声明template<typenameT>classComplex{public:Complex(Tr=0,Ti=0):real{r},imag{i}{}Complex(constComplex<T>&c):real{c.real},im......
  • kubesphere 的 流水线maven 模板缺少 kubectl解决
    最开始解决方案是maven的pod里通过在线下载kubectl命令 发现每次构建后端服务,都去官网下载kubectl命令相当慢。既然用到maven模板,遂将master节点的kubectl命令通过hostpath挂载到maven的pod模板里面。问题解决。 agent模板cm配置【jenkins-casc-config】在【kubes......
  • 谈一下next()在上面的场景中的作用,以及在odoo14中py3o打印模板中的适用场景。
    next()函数在Python中的主要作用是从可迭代对象中返回满足条件的第一个元素,或者在没有满足条件的元素时返回默认值。在上述场景中,next()用于在objects.additional_line中查找满足条件'预付款'inline.name的第一个元素的price_total属性,如果没有满足条件的元素,则返回默认......
  • 前端: 1.解构表达式;2字符串模板
      解构表达式,定义一个数组 <script> //解构表达式,定义一个数组//数组解构  letarr=[1,2,3];  let[a,b,c] =arr; //快速的将内容赋值到指定的变量上面  //const[a,b,c]=arr;  console.log(a,b,c)    //对象解构   ......
  • 拓扑排序模板
    #include<bits/stdc++.h>usingnamespacestd;structtoposort{ vector<vector<int>>e; vector<int>tp,din; intn; toposort(){} toposort(intn){ this->n=n; din.resize(n+1); e.resize(n+1); } voidadd(int......
  • Django学习(三) 之 模板中标签的使用
    写在前面最近看到稀土掘金在搞2023年终总结征文活动,一直想尝试投稿试试,周末我就花了近一下午时间写完初稿,然后周一、周二完成精读再改稿,感觉OK,昨晚凌晨第一时间在稀土掘金投稿。结果,又发生了同样的事情。同样的文章,在博客园上、公号上阅读量很OK,在稀土掘金上就上不来。这应......
  • 实验6 模板类、文件I/O和异常处理
    实验任务4Vector.hpp源代码1#include<iostream>2#include<stdexcept>34template<typenameT>5classVector{6private:7intsize;8T*vec;9public:10Vector<T>()=default;11......
  • shell脚本模板-从git拉取代码并打包部署
    source/etc/profile.~/.bash_profile#拉取能耗后端代码cd/usr/local/testmvncleanecho-e"从git华为云拉取后端代码"#首次clonegitpulltest.gitecho-e"从git华为云代码拉取完成"#工程打包echo-e"开始打jar包"mvnpackage-Dmaven.test.skip=true#删除原来的jar包rm......