当前位置: 首页 > 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设计模式
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • angular2 简述
  • ESLint简单操作
  • express + mock 让前后台并行开发
  • Hibernate【inverse和cascade属性】知识要点
  • iOS 颜色设置看我就够了
  • Java 网络编程(2):UDP 的使用
  • ng6--错误信息小结(持续更新)
  • PHP的类修饰符与访问修饰符
  • Theano - 导数
  • 第十八天-企业应用架构模式-基本模式
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 回流、重绘及其优化
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 来,膜拜下android roadmap,强大的执行力
  • 使用common-codec进行md5加密
  • 延迟脚本的方式
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 【干货分享】dos命令大全
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​Linux·i2c驱动架构​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #define,static,const,三种常量的区别
  • (¥1011)-(一千零一拾一元整)输出
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (10)STL算法之搜索(二) 二分查找
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (小白学Java)Java简介和基本配置
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)插入排序
  • (转) Android中ViewStub组件使用
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Sql Server 保留几位小数的两种做法
  • (转)菜鸟学数据库(三)——存储过程