题解

我现在真是太特么老年了

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

这题就是用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. 【Revit API】创建工作集并将element加入工作集中

    话不多说,直接上代码! public class WorkSetHelper { public void AddElementsToWorkSet(Document doc, List<Elem ...

  2. 适用于vue项目的打印插件(转载)

    出处:https://www.cnblogs.com/lvyueyang/p/9847813.html // 使用时请尽量在nickTick中调用此方法 //打印 export default (re ...

  3. service注入到action中

    service注入到action中 之前本人每次要获得service都是在action自己通过WebApplicationContext的getBean获得的,一直在spring中只配置到了servi ...

  4. 什么是spu和sku

    电商概念SPU与SKU SPU = Standard Product Unit (标准产品单位)SPU是商品信息聚合的最小单位,是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品的特性.通俗 ...

  5. python解析minicap

    上篇知道了minicap发送图片的格式,照着官网的app.js代码,改用一个python版的来解析它,适当扩展,可以做个小工具实时显示手机屏幕. 步骤: 一.手机开启minicap服务 adb she ...

  6. 小议 html 实体解析

    今天分享个小技巧,是群里一个朋友问的,"请问 + 这种类型的字符串怎么转换成我们想要的字符 + ,有什么简便的js方法吗"其实问题说简单也简单,说难也难.我们要分情况来描述问题解决 ...

  7. html5 canvas 垂直渐变描边

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. ASP.NET记录错误日志的方式

    程序记录错误日志是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的程序马迹.那么,常用的记录错误日志的方式有哪些呢? 大多数情况下使用的是 1.直接记录为txt/xm ...

  9. spring Mvc + Maven + 拷贝插件 (十一)

    maven-antrun-plugin:可用于在项目编译打包时,把文件指定的文件拷贝到指定的位置,我们打包一般都是打包到 项目 的target 文件下; <groupId>org.apac ...

  10. 20155212 2016-2017-2 《Java程序设计》第8周学习总结

    20155212 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 Chapter14 1. Channel架构与操作 想要取得Channel的实作对象,可以使 ...