题解

我现在真是太特么老年了

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

这题就是用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].rev
void 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 ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【LOJ】#2230. 「BJOI2014」大融合的更多相关文章

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

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

  2. Loj 2230. 「BJOI2014」大融合 (LCT 维护子树信息)

    链接:https://loj.ac/problem/2230 思路: 设立siz数组保存虚点信息,sum表示总信息 维护子树信息link操作和access操作需要进行一些改动 可参考博客:https: ...

  3. loj2230 「BJOI2014」大融合

    LCT裸题 我LCT学傻了这题明显可以树剖我不会树剖了 本来的siz是Splay上的子树和,并没有什么用. 所以每个点维护虚子树和和子树和 虚子树和即虚边连接的子树和,且只有在access和link操 ...

  4. @loj - 2092@ 「ZJOI2016」大森林

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Y 家里有一个大森林,里面有 n 棵树,编号从 1 到 n. ...

  5. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  6. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  7. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  8. Loj #3055. 「HNOI2019」JOJO

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

  9. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

随机推荐

  1. MT【203】连续型的最值

    (北大自招)已知$-6\le x_i\le 10 (i=1,2,\cdots,10),\sum\limits_{i=1}^{10}x_i=50,$当$\sum\limits_{i=1}^{10}x^2 ...

  2. MT【79】任意和存在并存

    评:一般这个题目是先考虑$x$的存在性,再考虑$t$的任意性.最后按照动区间定轴类型处理,考虑区间和对称轴的相对位置.

  3. SpringBoot基础篇AOP之基本使用姿势小结

    一般来讲,谈到Spring的特性,绕不过去的就是DI(依赖注入)和AOP(切面),在将bean的系列中,说了DI的多种使用姿势:接下来看一下AOP的玩法 <!-- more --> I. ...

  4. 【BZOJ1025】[SCOI2009]游戏(动态规划)

    [BZOJ1025][SCOI2009]游戏(动态规划) 题面 BZOJ 洛谷 题解 显然就是一个个的置换,那么所谓的行数就是所有循环的大小的\(lcm+1\). 问题等价于把\(n\)拆分成若干个数 ...

  5. 稳定排序nlogn之归并排序_一维,二维

    稳定排序nlogn之归并排序_一维,二维 稳定排序:排序时间稳定的排序 稳定排序包括:归并排序(nlogn),基数排序[设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排 ...

  6. 目标检测评价指标(mAP)

    常见指标 precision 预测出的所有目标中正确的比例 (true positives / true positives + false positives). recall 被正确定位识别的目标 ...

  7. Java 泛型类型基础

    为什么要使用泛型? 未使用泛型的情况: // 创建列表类 List list = new ArrayList(); // 添加一个类型为 String 的列表元素 list.add("hel ...

  8. node.js原生后台进阶(一)

    后台对于我们前端来说可能真的有点陌生,下面我来理清一下思绪吧. 一个基本的后台要求有如下功能: 1.与前端的数据交互 2.操作数据库(增删改查) 3.操作服务器文件(也大概是增删改查) 本次我们先讨论 ...

  9. MongoDB 聚合嵌入的数组(扁平化数据+管道)

    MongoDB学习教程 先看下要操作的主要数据结构: { "_id" : "000015e0-3e9c-40b3-bd0d-6e7949f455c0", &qu ...

  10. Yii 自定义模型路径

    例如现有两个 Yii 项目,分别是 test1 和 test2.在 test1 中,已经有模型了,test2 直接调用 test1 中的模型,其实添加个别名,然后修改下配置即可. 先在 index.p ...