当前位置: 首页 > news >正文

[BZOJ 3282] Tree 【LCT】

题目链接:BZOJ - 3282

 

题目分析

这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息。

写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x][1] ,然而我写成了 Son[x][0]

 

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

inline void Read(int &Num)
{
	char c = getchar();
	bool Neg = false;
	while (c < '0' || c > '9')
	{
		if (c == '-') Neg = true;
		c = getchar();
	}
	Num = c - '0'; c = getchar();
	while (c >= '0' && c <= '9')
	{
		Num = Num * 10 + c - '0';
		c = getchar();
	}
	if (Neg) Num = -Num;
}
     
const int MaxN = 300000 + 5;

int n, m;
int A[MaxN], T[MaxN], Father[MaxN], Son[MaxN][2];

bool isRoot[MaxN], Rev[MaxN];

inline void Update(int x)
{
	T[x] = T[Son[x][0]] ^ T[Son[x][1]] ^ A[x];
}

inline void Reverse(int x)
{
	Rev[x] = !Rev[x];
	swap(Son[x][0], Son[x][1]);
}

inline void PushDown(int x)
{
	if (!Rev[x]) return;
	Rev[x] = false;
	if (Son[x][0]) Reverse(Son[x][0]);
	if (Son[x][1]) Reverse(Son[x][1]);
}

void Rotate(int x)
{
	int y = Father[x], f;
	PushDown(y); PushDown(x);
	if (x == Son[y][0]) f = 1;
	else f = 0;
	if (isRoot[y])
	{
		isRoot[y] = false;
		isRoot[x] = true;
	}
	else
	{
		if (y == Son[Father[y]][0]) Son[Father[y]][0] = x;
		else Son[Father[y]][1] = x;
	}
	Father[x] = Father[y];
	Son[y][f ^ 1] = Son[x][f];
	if (Son[x][f]) Father[Son[x][f]] = y;
	Son[x][f] = y;
	Father[y] = x;
	Update(y);
	Update(x);
}

void Splay(int x)
{
	int y;
	while (!isRoot[x])
	{
		y = Father[x];
		if (isRoot[y])
		{
			Rotate(x);
			break;
		}
		if (y == Son[Father[y]][0])
		{
			if (x == Son[y][0])
			{
				Rotate(y);
				Rotate(x);
			}
			else
			{
				Rotate(x);
				Rotate(x);
			}
		}
		else
		{
			if (x == Son[y][1])
			{
				Rotate(y);
				Rotate(x);
			}
			else
			{
				Rotate(x);
				Rotate(x);
			}
		}
	}
}

int Access(int x)
{
	int y = 0;
	while (x != 0)
	{
		Splay(x);
		PushDown(x);
		if (Son[x][1]) isRoot[Son[x][1]] = true;
		Son[x][1] = y;
		if (y) isRoot[y] = false;
		Update(x);
		y = x;
		x = Father[x];
	}
	return y;
}

void Make_Root(int x)
{
	int t = Access(x);
	Reverse(t);
}

int Find_Root(int x)
{
	int t = Access(x);
	while (Son[t][0] != 0) t = Son[t][0];
	return t;
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i)
	{
		Read(A[i]);
		T[i] = A[i];
		isRoot[i] = true;
		Father[i] = 0;
	}
	int f, x, y, t, fx, fy;
	for (int i = 1; i <= m; ++i)
	{
		Read(f); Read(x); Read(y);
		switch (f) 
		{
			case 0 : 
				Make_Root(x);
				t = Access(y);
				printf("%d\n", T[t]);
				break;
			
			case 1 :
				fx = Find_Root(x);
				fy = Find_Root(y);
				if (fx != fy)
				{
					Make_Root(x);
					Splay(x);
					Father[x] = y;
				}
				break;
				
			case 2 :
				Make_Root(x);
				Access(y);
				Splay(y);
				PushDown(y);
				if (Son[y][0] == x)
				{
					isRoot[Son[y][0]] = true;
					Father[Son[y][0]] = 0;
					Son[y][0] = 0;
					Update(y);
				}
				break;
				
			case 3 :
				Splay(x);
				A[x] = y;
				Update(x);
				break;
		}
	}
	return 0;
}

  

转载于:https://www.cnblogs.com/JoeFan/p/4446669.html

相关文章:

  • npm script 一见钟情
  • 团队项目之典型用户
  • C++笔记(1)——Anniversary
  • 【第43题】【062题库】2019年OCP认证062考试新题
  • 自我调查 使用输入法
  • linux轻量级监控工具-nmon
  • js基础---变量命名以及运算符
  • JS 原型、原型继承、原型链的理解
  • Linux 双网卡绑定
  • Docker 的基本概念和框架
  • css书写规范
  • Android 8.0允许安装未知来源
  • 蜕变成蝶~Linux设备驱动之中断与定时器
  • 1.9(设计模式)装饰器模式
  • TypeScript Visitor设计模式
  • 【mysql】环境安装、服务启动、密码设置
  • 08.Android之View事件问题
  • Cumulo 的 ClojureScript 模块已经成型
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java深入 - 深入理解Java集合
  • JS变量作用域
  • Linux下的乱码问题
  • MySQL数据库运维之数据恢复
  • PAT A1017 优先队列
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Spring核心 Bean的高级装配
  • 看域名解析域名安全对SEO的影响
  • 利用DataURL技术在网页上显示图片
  • 浅谈web中前端模板引擎的使用
  • 学习ES6 变量的解构赋值
  • 自动记录MySQL慢查询快照脚本
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • !$boo在php中什么意思,php前戏
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (八)c52学习之旅-中断实验
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (一)Java算法:二分查找
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)程序员疫苗:代码注入
  • (转)平衡树
  • .NET 8.0 发布到 IIS
  • .net 程序发生了一个不可捕获的异常
  • .NET 反射 Reflect
  • @RestControllerAdvice异常统一处理类失效原因
  • [.net] 如何在mail的加入正文显示图片
  • [20181219]script使用小技巧.txt
  • [Android 数据通信] android cmwap接入点
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C#基础]说说lock到底锁谁?
  • [codevs1288] 埃及分数
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [CSS]CSS 的背景
  • [IDF]被改错的密码