LuoguP4219 [BJOI2014]大融合(LCT)
早上考试想用\(LCT\)维护联通块\(size\),现在才发现\(LCT\)的\(size\)有虚实之分
\(Link\)与\(Acess\)中虚实变,干他丫的
\(Splay\)中只是相对关系,没有虚实变,因此不搞它
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for(register int a = (b); a <= (c); ++a)
#define nR(a,b,c) for(register int a = (b); a >= (c); --a)
#define Fill(a,b) memset(a, b, sizeof(a))
#define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b))
#define ON_DEBUGG
#ifdef ON_DEBUGG
#define D_e_Line printf("-----------\n")
#define D_e(x) std::cout << (#x) << " : " <<x << "\n"
#define FileOpen() freopen("in.txt", "r", stdin)
#define FileSave() freopen("out.txt", "w", stdout)
#define Pause() system("pause")
#include <ctime>
#define TIME() fprintf(stderr, "\nTIME : %.3lfms\n", clock() * 1000.0 / CLOCKS_PER_SEC)
#else
#define D_e_Line ;
#define D_e(x) ;
#define FileOpen() ;
#define FilSave ;
#define Pause() ;
#define TIME() ;
#endif
struct ios {
	template<typename ATP> ios& operator >> (ATP &x) {
		x = 0; int f = 1; char c;
		for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
		while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
		x *= f;
		return *this;
	}
}io;
using namespace std;
template<typename ATP> inline ATP Min(ATP a, ATP b) {
	return a < b ? a : b;
}
template<typename ATP> inline ATP Max(ATP a, ATP b) {
	return a > b ? a : b;
}
template<typename ATP> inline ATP Abs(ATP a) {
	return a < 0 ? -a : a;
}
const int N = 1e5 + 7;
struct LCT {
	int ch[2], fa, siz, sz; // siz : true edge, sz : virtual edge
	bool rev;
} t[N];
#define ls t[u].ch[0]
#define rs t[u].ch[1]
inline int Ident(int &u) {
	return t[t[u].fa].ch[1] == u;
}
inline bool IsRoot(int &u) {
	return t[t[u].fa].ch[0] != u && t[t[u].fa].ch[1] != u;
}
inline void Pushup(int &u) {
	if(u) t[u].siz = t[ls].siz + t[rs].siz + t[u].sz + 1;
	// left + right + virtual + self
}
inline void Pushrev(int u) {
	Swap(ls, rs);
	t[u].rev ^= 1;
}
inline void Pushdown(int u) {
	if(!t[u].rev) return;
	if(ls) Pushrev(ls);
	if(rs) Pushrev(rs);
	t[u].rev = 0;
}
inline void Rotate(int x) {
	int y = t[x].fa, z = t[y].fa, k = Ident(x);
	t[x].fa = z; if(!IsRoot(y)) t[z].ch[Ident(y)] = x;
	t[y].ch[k] = t[x].ch[k ^ 1], t[t[x].ch[k ^ 1]].fa = y;
	t[x].ch[k ^ 1] = y, t[y].fa = x;
	Pushup(y), Pushup(x);
}
int sta[N], top;
inline void Splay(int u) {
	int x = u;
	while(!IsRoot(u)){
		sta[++top] = u;
		u = t[u].fa;
	}
	sta[++top] = u;
	while(top) Pushdown(sta[top--]);
	while(!IsRoot(x)){
		int y = t[x].fa;
		if(!IsRoot(y)){
			Ident(x) == Ident(y) ? Rotate(y) : Rotate(x);
		}
		Rotate(x);
	}
	Pushup(x);
}
inline void Access(int u) {
	for(register int v = 0; u; v = u, u = t[u].fa){
		Splay(u);
		t[u].sz += t[rs].siz - t[v].siz;
		t[u].ch[1] = v;
		Pushup(u);
	}
}
inline void MakeRoot(int u) {
	Access(u);
	Splay(u);
	Pushrev(u);
}
inline void Split(int u, int v) {
	MakeRoot(u);
	Access(v);
	Splay(v);
}
inline void Link(int u, int v) {
	Split(u, v);
	t[u].fa = v;
	t[v].sz += t[u].siz;
}
inline long long Query(int u, int v) {
	Split(u, v);
	return 1ll * (t[u].sz + 1) * (t[v].sz + 1);
}
//inline void Link(int u, int v) {
//	MakeRoot(u);
//	MakeRoot(v);
//	t[u].fa = v;
//	t[v].sz += t[u].siz;
//	Pushup(v);
//}
//inline long long Query(int u, int v) {
//	MakeRoot(u);
//	MakeRoot(v);
//	return 1ll * (t[u].sz + 1) * (t[v].sz + 1);
//}
char opt[13];
int main() {
	int n, m;
	io >> n >> m;
	R(i,1,n){
		t[i].siz = 1;
		t[i].sz = 0;
	}
	while(m--){
		scanf("%s", opt + 1);
		int x, y;
		io >> x >> y;
		if(opt[1] == 'A'){
			Link(x, y);
		}
		else{
			printf("%lld\n", Query(x, y));
		}
	}
	return 0;
}

LuoguP4219 [BJOI2014]大融合(LCT)的更多相关文章
- [BZOJ4530][Bjoi2014]大融合  LCT + 启发式合并
		
[BZOJ4530][Bjoi2014]大融合 试题描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是 ...
 - 【bzoj4530】[Bjoi2014]大融合  LCT维护子树信息
		
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量 ...
 - Luogu4219 BJOI2014 大融合 LCT
		
传送门 题意:写一个数据结构,支持图上连边(保证图是森林)和询问一条边两端的连通块大小的乘积.$\text{点数.询问数} \leq 10^5$ 图上连边,$LCT$跑不掉 支持子树$size$有点麻 ...
 - BZOJ4530[Bjoi2014]大融合——LCT维护子树信息
		
题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它的简单路径的数 ...
 - BZOJ.4530.[BJOI2014]大融合(LCT)
		
题目链接 BZOJ 洛谷 详见这 很明显题目是要求去掉一条边后两边子树sz[]的乘积. LCT维护的是链的信息,那么子树呢? 我们用s_i[x]来记录轻边连向x的子树的和(记作虚儿子),那么sum[x ...
 - [BJOI2014]大融合(LCT)
		
题面 luogu bzoj是权限题.. 题解 \(LCT\)维护子树信息 因为\(LCT\)中有一些虚子树,\(splay\)维护不了. 所以要新开一个数组来记录 然后注意\(link\)时 是先\( ...
 - 【洛谷 P4219】 [BJOI2014]大融合(LCT)
		
题目链接 维护子树信息向来不是\(LCT\)所擅长的,所以我没搞懂qwq 权当背背模板吧.Flash巨佬的blog里面写了虽然我没看懂. #include <cstdio> #define ...
 - bzoj 4530 [Bjoi2014]大融合——LCT维护子树信息
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4530 LCT维护子树 siz .设 sm[ ] 表示轻儿子的 siz 和+1(1是自己的si ...
 - BZOJ4530:[BJOI2014]大融合(LCT)
		
Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...
 
随机推荐
- HashMap 中的 hash 函数
			
1. 什么是 hash 函数 hash 函数,即散列函数,或叫哈希函数.它可以将不定长的输入,通过散列算法转换成一个定长的输出,这个输出就是散列值.需要注意的是,不同的输入通过散列函数,也可能会得到同 ...
 - 【算法】Floyd算法
			
什么是Floyd Floyd用于求最短路程.举个栗子,给你一张图,让你求出点[1]到点[5]的最短路程,你会怎么求? (画图工具:CS Academy) 如上图,有向边分别是 1->2 1-& ...
 - linux基本命令续(杂糅和转)
			
此处使用CP 命令复制/etc/profile和/etc/init.d/network到家目录下,当然也可以指定其他目录如./ 根目录等. 在2提示处,如果输错了文字,可以ctrl+backspace ...
 - C#中的CSV文件读写
			
目录 CSV文件标准 文件示例 RFC 4180 简化标准 读写CSV文件 使用CsvHelper 使用自定义方法 基于简化标准的写CSV文件 使用TextFieldParser解析CSV文件 使用正 ...
 - 将Hexo搭建到自己的服务器上
			
http://xybin.top/posts/9373.html 第一部分:服务器端的操作 1.安装git 和nginx yum install -y nginx git 2.添加一个git用户 #添 ...
 - Python-安装pycocotools错误记录
			
安装 pycocotools 时出现错误 fatal error: Python.h: No such file or directory 解决方式 apt-get install python3.8 ...
 - 运行时应用自我保护(RASP):应用安全的自我修养
			
应用程序已经成为网络黑客想要渗透到企业内部的绝佳目标. 因为他们知道如果能发现并利用应用程序的漏洞,他们就有超过三分之一的机会成功入侵. 更重要的是,发现应用程序漏洞的可能性也很大. Contrast ...
 - UiPath Orchestrator安装步骤
			
UiPath Orchestrator安装步骤 答案在这 https://rpazj.com/thread-219-1-1.html
 - Python:socket编程教程
			
ocket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端. 首先,导入Python中的socket模块: import socket Pytho ...
 - linux中CentOS配置文件编辑错误撤回
			
未编辑状态下 U键 撤销 DD 快速删除