题解

我现在真是太特么老年了

一写数据结构就颓废,难受

这题就是用lct维护子树
???lct怎么维护子树

这样想,我们给每个点记录虚边所在的子树大小,只发生在Access和link的时候
这样的话我们在这两个操作的时候顺带维护一下就好了

Access的时候加上新的虚儿子,减掉变成实边的那个儿子
link直接加上虚儿子的大小即可

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
int N,M;
namespace lct {struct node {int lc,rc,fa,sum,siz;bool rev;}tr[MAXN];
#define lc(u) tr[u].lc
#define rc(u) tr[u].rc
#define fa(u) tr[u].fa
#define sum(u) tr[u].sum
#define siz(u) tr[u].siz
#define rev(u) tr[u].revvoid Init() {for(int i = 1 ; i <= N ; ++i) sum(i) = siz(i) = 1;}void reverse(int u) {swap(lc(u),rc(u));rev(u) ^= 1;}void pushdown(int u) {if(rev(u)) {reverse(lc(u));reverse(rc(u));rev(u) = 0;}}void update(int u) {sum(u) = siz(u);sum(u) += sum(lc(u)) + sum(rc(u));}bool isRoot(int u) {if(!fa(u)) return true;else return rc(fa(u)) != u && lc(fa(u)) != u;} bool which(int u) {return u == rc(fa(u));}void rotate(int u) {int v = fa(u);if(!isRoot(v)) { (v == lc(fa(v)) ? lc(fa(v)) : rc(fa(v))) = u;}fa(u) = fa(v);fa(v) = u;if(u == lc(v)) {fa(rc(u)) = v;lc(v) = rc(u);rc(u) = v;}else {fa(lc(u)) = v;rc(v) = lc(u);lc(u) = v;}update(v);}void Splay(int u) {static int que[MAXN],qr;qr = 0;int x;for(x = u ; !isRoot(x) ; x = fa(x)) que[++qr] = x;que[++qr] = x;for(int i = qr ; i >= 1 ; --i) pushdown(que[i]);while(!isRoot(u)) {if(!isRoot(fa(u))) {if(which(fa(u)) == which(u)) rotate(fa(u));else rotate(u);}rotate(u);}update(u);}void Access(int u) {int x;for(x = 0 ; u ; x = u , u = fa(u)) {Splay(u);siz(u) += sum(rc(u));siz(u) -= sum(x);rc(u) = x;update(u);}}void Makeroot(int u) {Access(u);Splay(u);reverse(u);}void Link(int u,int v) {Makeroot(u);Makeroot(v);Splay(v);fa(v) = u;siz(u) += sum(v);Splay(u);}int64 Query(int u,int v) {Makeroot(u);Access(v);Splay(u);update(v);return 1LL * (sum(u) - sum(v)) * sum(v);}
}
void Solve() {char op[5];int x,y;read(N);read(M);lct::Init();for(int i = 1 ; i <= M ; ++i) {scanf("%s",op + 1);read(x);read(y);if(op[1] == 'A') {lct::Link(x,y);}else {out(lct::Query(x,y));enter;}}
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifSolve();return 0;
}

转载于:https://www.cnblogs.com/ivorysi/p/10104998.html

【LOJ】#2230. 「BJOI2014」大融合相关推荐

  1. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  2. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  3. Loj #2983. 「WC2019」数树

    Loj #2983. 「WC2019」数树 题目背景 白兔喜欢树. 白云喜欢数数. 有 \(n\) 只鼠,白兔用 \(n − 1\) 根蓝色绳子把它们连成了一棵树,每根蓝色绳子连着两只鼠,白云用 \( ...

  4. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

  5. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  6. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  7. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  8. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  9. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

最新文章

  1. Plugin Error
  2. Javascript中的类实现
  3. 二叉搜索树(BST)?平衡二叉树(AVL)?
  4. python编程入门详解_python编程入门知识练习
  5. 斜杠青年Ruff:区块链只是分内事
  6. 1.5 编程基础之循环控制 29 数字反转
  7. Oracle数据库的状态查询
  8. mybatis 多表关联查询_Java修行第041天--MyBatis框架(下)--多表查询
  9. Mac系统 python3.7安装
  10. mysql定时任务多条sql_【SQL】使用Navicat创建MySQL定时任务重复执行某个sql语句
  11. oracle替换字符串replace
  12. MacBook M1苹果电脑安装 SVN 以及 简单使用SVN
  13. 力软部署oracle,力软敏捷开发框架
  14. steam饥荒服务器配置修改,饥荒联机版专用服配置修改器
  15. 503热敏电阻温度阻值对应表
  16. Typora编辑的markdown文档莫名其妙消失或未保存,两种恢复方式
  17. SysML v2配置eclipse
  18. 2018 Multi-University Training Contest 1 部分简单题解析
  19. 用代码向网站提交数据
  20. 聚磷酸酯-紫杉醇前药(PTX-PEEP)|聚姜黄素-二硫键-聚甲基丙烯酸二乙胺基乙酯-聚磺酸甜菜碱|齐岳生物

热门文章

  1. c语言高精度算法阶乘_学了这么久的C语言,原来可以这样解决算法问题...
  2. Python数据结构与算法(2.2)——顺序表
  3. Python字符串isidentifier()
  4. mapreduce代码示例_MapReduce算法示例
  5. linux基本命令示例_Linux中带示例的sort命令
  6. 还为重复安装开发环境而烦吗? 这或许是更好的解决方案 —— docker
  7. awk的基本使用方法
  8. SEO哪些因素会照成百度排名不稳定
  9. Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口
  10. 文件目录权限(chmod、chown、chgrp)umask、隐藏权限(lsattr、chattr)