动态树 之 Link-Cut Tree (LCT)

Vscode远程免密连接Linux虚拟机,并配置C/C++运行环境 目前想要深入学习在Linux,也为了方便编写C/C++程序。Linux的环境里一般自带有c++的编译环境,如果没有安装gcc和g++等编译器也比较便利。但是在虚拟机里用vim编写C++程序又不得劲,因此打算使用vscode远程连接Linux虚拟机进行学习。为了防止自己以后还要再配置,重复踩坑,因此写下这篇博客用做记录。环境:windows11、VMware17、rocky linux9.1 ( 开源的CentOS9 ) 阅读详情

原理啥的实在不想写(太枯燥了) 主要讲各个操作的代码实现

 

感谢@Harry_bh钦自为本人弄了篇题解 于是本人就学会了

现在想想为了个LCT我学的东西还挺多的

 

前置知识 Splay(力推我的) + 树链剖分(最好理解) 我当诸君都很熟练了啊QAQ

原理概念之类的戳这里 他讲的挺不错的 然后我主要记记操作&程序上

话说LCT里相关操作的子程序好多 讲起来比较乱 首先规定一个模板题 然后相关基础操作围绕此题展开

先把核心操作丢上面 然后分询问要求放相关操作 建议顺序:Link—>delete—>change(date)—>query(get) 然后多翻几遍核心操作啦

 

注:个人习惯原因有些子程序名字会相替换 个人的丢括号里面

 

1.isroot(pdroot)

这个就是判断当前点是不是他所在的 splay 的根了啦 其实我也不想放前面但后面常常用到

如果一个点是根 那他父亲就和他没什么关系了 在树上一大把 splay 的 LCT 上 连接他们的只是各个根的父亲丢到上面的 splay 里

所以一个根的父亲的儿子不会指向他!我们可以利用这个性质判断一个点是不是他所在 splay 的 根

代码只有一行 见下(说四行的我不打你)

inline short pdroot(int x)
{
	return (e[e[x].fa].son[0] != x) && (e[e[x].fa].son[1] != x);
}

 

然后我先把 splay 相关丢出来好了 这样看着 LCT 亲切点

2.pushup(update)

这个地方除了rotate其他时候也要用到哦 因为不止这地方换了父子从属关系

所以打成了个子程序= = 本题里就是维护路径的异或和

下放代码

inline void update(int x)
{
	e[x].ans = e[e[x].son[0]].ans ^ e[e[x].son[1]].ans ^ e[x].v;
}

 

3.pushdown

就是下放旋转的 lazy 标记

和splay区间翻的完全一样啦(什么?不会?快去看我的Splay)

下放代码

inline void pushdown(int x)
{
	if (!e[x].laz) return;
	int bot = e[x].son[0];
	e[x].son[0] = e[x].son[1];
	e[x].son[1] = bot;
	e[e[x].son[0]].laz ^= 1;
	e[e[x].son[1]].laz ^= 1;
	e[x].laz = 0;
}

 

4.relax(change)

这个就是在换父子关系前同一将涉及到的点的lazy标记下放

因为某些原因我们只能从底下那个点找起 但是标记更新要从最上面啊

所以 递归 然后从最上面更新 这里利用pushdown

其实pushdown和relax只有splay里面涉及到的惹= =其他地方不用(其他地方用splay2333)

下放代码

inline void change(int x)
{
	if (!pdroot(x)) change(e[x].fa);
	pushdown(x);
}

 

5.splay

许多人的 splay (包括我) 的循环判断都是 父节点不为0的时候往下跑

但这里很多 splay 而且判断父节点是不是出去了很麻烦

于是判断当前点是不是根就好啦 往上翻 1.isroot 其他照常 splay

下放代码

inline void splay(int x)
{
	change(x);
	while (!pdroot(x))
	{
		int y = e[x].fa,z = e[y].fa;
		if (!pdroot(y)) {
			if ((e[z].son[0] == y) ^ (e[y].son[0] == x)) rotate(x);
			else rotate(y);
		} rotate(x);
	}
}

 

6.rotate

对了就是熟悉的 rotate 但是有不同的地方 (x是当前点 y是父亲 z是祖父)

这里关于z的话 如上 1.isroot 中所说 如果 z 和 x 不是同一 splay 中的话 z 的孩子就不用更新成 x

所以这里丢个判定就好了啦 然后....这类题目不用维护 size 喜大普奔 但是求答案还是要维护下

下放代码 (关于求答案 到时候 access 从根连起来直接找根的答案数组就可以输出了)

 

inline void rotate(int x)
{
	int y = e[x].fa,z = e[y].fa,mode = e[y].son[0] == x;
	if (!pdroot(y)) e[z].son[e[z].son[1] == y] = x;
	e[x].fa = z;
	e[y].son[mode ^ 1] = e[x].son[mode];
	e[e[x].son[mode]].fa = y;
	e[x].son[mode] = y;
	e[y].fa = x;
	update(y); //update先后关系注意 和splay一样先子后父
	update(x);
}

 

好了splay相关讲完了 下面就是LCT的核心部分了(上面也包括了的哈)

7.access

这个大有用处了 作用是把某点和原树的根所在路径变成重边

然后因为性质之类的 需要把原重边 (如果不一样) 换成轻边

这个用处= =之后会提到的 就是方便处理问题(因为要处理的两个数会是打通的重边的两个最外面的点)

然后怎么更新呢 首先断掉要通到的点的儿子

然后我们要splay一下 因为这样可使连着当前点的重边在点的右儿子处

然后更新当前点儿子 这里和首先断点可以连起来 设个变量一开始为0 然后第一次更新的点重儿子通向0 就是无重儿子了

很巧妙 然后后面把当前点记录 之后推到他父亲的时候把他父亲的重儿子记录到他上面 再更新他

splay之后的更新也会使当前点的儿子变化 所以要update当前点的异或和的答案

下放代码

inline void access(int x)
{
	for (int y = 0 ; x ; y = x,x = e[x].fa)
	{
		splay(x);
		e[x].son[1] = y;
		update(x);
	}
}

 

8.makeroot

就是把某个点变成他所在的splay的根啦

首先打通他到原树根的路径 使得他为全树深度最大 然后把他弄到根 这时候他是没有右儿子的

然后为了处理该点和另外一个点的相对关系 (对 makeroot就是让这两点产生更亲♂密的关系的)

我们用access和splay把当前点通到根 然后还要预翻转一下 设当前点为 x 另一点为 y

这样使得处理 y 点时 因为处理 y 点时必有access使得之后的splay变成两点中的唯一简单路径

然后splay把 x + 1 到 y 翻转 y 就是 x + 1 (在那个地方) 于是可以通过父子关系处理操作

绝妙啊 不说了丢代码

inline void makeroot(int x)
{
	access(x);
	splay(x);
	e[x].laz ^= 1;
}

 

好了好了接下来依次处理本题的询问 首先是link的两个

9.findroot(f)

就是找当前点所在的splay的root啦

首先打通 然后当前点旋到根 然后.......

显然是深度往上跳嘛 那就找左儿子啦 深度减小嘛

直到找到某点儿子不是他 说明他儿子和他是属于不同的树了的 返回他即可

下放代码

inline int f(int p)
{
	access(p),splay(p);
	while (e[p].son[0]) p = e[p].son[0];
	return p;
}

 

10.link

就是连接两点嘛 首先先判两点是否联通 如果联通还连边那这种题是不能用LCT做的惹qwq

然后让其中一个点旋到根 那他是没父亲的了

把他父亲变成另外一个点 那就连起来了啦

另外一个点的儿子不用更新 不然原本的就乱了 这个等之后处理其他操作的时候整理就好

下放代码

inline void link(int x,int y)
{
	if (f(x) != f(y)) makeroot(x),e[x].fa = y;
}

 

11.delete(dele)

删边 同link一样要先makeroot其中一个点

但删边对两点的相对关系要求更多 我们要把两点弄到一块

对了makeroot里面翻转使得两点丢到一块了

设两点为 x 点和 y 点

于是 此时 x 变成根了 然后 y 的深度就是 x + 1

但是这样很可能 y 在 x 的右儿子的左子树里面

所以 y 旋上去 然后比 y 小的 只有 x 于是 x 必定是其左儿子

先判定一下是不是 x 嘛 如果不是说明 (x,y) 这条边不存在

然后父子关系都清零就好了

下放代码

inline void dele(int x,int y)
{
	makeroot(x);
	access(y);
	splay(y);
	if (e[y].son[0] == x) e[y].son[0] = 0,e[x].fa = 0;
}

 

12.modify(date)

原本想用update的但是重名了= =

就是更新点权 超简单的

当前点权直接换掉 旋到根

splay经典操作不多讲了

下放代码

inline void date(int x,int y)
{
	e[x].v = y;
	splay(x);
}

 

13.query(get)

好了最后的查询

一个点丢到根上面 makeroot大法好

access打通到另一个点 然后两点间简单路径的异或和就是答案~~

但是!这两操作是把链提取出来了 但我们要得到整棵splay的答案 就需要splay另一个点 然后再返回根节点的值

所以还要把另一个点旋上来 输出这个点的答案

下放代码

inline int get(int x,int y)
{
	makeroot(x);
	access(y);
	splay(y);
	return e[y].ans;
}

 

 

 

好了好了总算完了=-= 下面塞个总的代码 模板这里再丢一个

#include <cstdio>
#define I inline
#define like int
#define love void
using namespace std;
const int MAXN = 300010;
struct lct {
	int fa,son[2],ans,laz,v;
} e[MAXN];
I like r()
{
	char q = getchar(); int x = 0,y = 0;
	while (q < '0' && q != '-' || q > '9') q = getchar();
	if (q == '-') ++ y,q = getchar();
	while ('0' <= q && q <= '9')
		x = (x << 3) + (x << 1) + q - (3 << 4),q = getchar();
	return y ? -x : x;
}
I like pdroot(int x)
{
	return e[e[x].fa].son[0] != x && e[e[x].fa].son[1] != x;
}
I love pushdown(int x)
{
	if (!e[x].laz) return;
	int bot = e[x].son[0];
	e[x].son[0] = e[x].son[1];
	e[x].son[1] = bot;
	e[e[x].son[0]].laz ^= 1;
	e[e[x].son[1]].laz ^= 1;
	e[x].laz = 0;
}
I love change(int x)
{
	if (!pdroot(x)) change(e[x].fa);
	pushdown(x);
}
I love update(int x)
{
	e[x].ans = e[e[x].son[0]].ans ^ e[e[x].son[1]].ans ^ e[x].v;
}
I love rotate(int x)
{
	int y = e[x].fa,z = e[y].fa,mode = e[y].son[0] == x;
	if (!pdroot(y)) e[z].son[e[z].son[1] == y] = x;
	e[x].fa = z;
	e[y].son[mode ^ 1] = e[x].son[mode];
	e[e[x].son[mode]].fa = y;
	e[x].son[mode] = y;
	e[y].fa = x;
	update(y);
	update(x);
}
I love splay(int x)
{
	change(x);
	while (!pdroot(x))
	{
		int y = e[x].fa,z = e[y].fa;
		if (!pdroot(y)) {
			if ((e[z].son[0] == y) ^ (e[y].son[0] == x)) rotate(x);
			else rotate(y);
		} rotate(x);
	}
}
I love access(int x)
{
	for (int y = 0 ; x ; y = x,x = e[x].fa)
	{
		splay(x);
		e[x].son[1] = y;
		update(x);
	}
}
I like f(int p)
{
	access(p),splay(p);
	while (e[p].son[0]) p = e[p].son[0];
	return p;
}
I love makeroot(int x)
{
	access(x);
	splay(x);
	e[x].laz ^= 1;
}
I like get(int x,int y)
{
	makeroot(x);
	access(y);
	splay(y);
	return e[y].ans;
}
I love link(int x,int y)
{
	if (f(x) != f(y)) makeroot(x),e[x].fa = y;
}
I love dele(int x,int y)
{
	makeroot(x);
	access(y);
	splay(y);
	if (e[y].son[0] == x) e[y].son[0] = 0,e[x].fa = 0;
}
I love date(int x,int y)
{
	e[x].v = y;
	splay(x);
}
int main()
{
	int n = r(),m = r();
	for (int a = 1 ; a <= n ; ++ a) e[a].ans = e[a].v = r();
	while (m--)
	{
		int mode = r(),x = r(),y = r();
		switch (mode)
		{
			case 0:printf("%d\n",get(x,y));break;
			case 1:link(x,y);break;
			case 2:dele(x,y);break;
			case 3:date(x,y);break;
		}
	}
	return 0;
}

 

2018.11.4 update——

万般借鉴然后瞎搞一天半终于搞出 LCT模板2 (lazy加法乘法下放) 了

这题.....就是多了两个 lazy 标记

这里标记和siz差不多维护就好了呀 对于操作就是放到那个点上 更新那个点值 然后标记放放

因此换父子关系的时候就要处理两子节点 然后更新两子节点的值

其他照常 对了建图用link就好了啦

下放代码

#include <cstdio>
#define mod 51061
#define MAXN 100010
#define ll long long
using namespace std;
struct splay {
	int fa,son[2],siz,rot;
	ll ans,v,laz1,laz2;
} e[MAXN];
inline int r()
{
	char q = getchar(); int x = 0,y = 0;
	while (q < '0' && q != '-' || q > '9') q = getchar();
	if (q == '-') ++ y,q = getchar();
	while ('0' <= q && q <= '9')
		x = (x << 3) + (x << 1) + q - (3 << 4),q = getchar();
	return y ? -x : x;
}
inline short pdroot(int x)
{
	return e[e[x].fa].son[0] != x && e[e[x].fa].son[1] != x;
}
inline void update(int x)
{
	e[x].siz = e[e[x].son[0]].siz + e[e[x].son[1]].siz + 1;
	e[x].ans = (e[e[x].son[0]].ans + e[e[x].son[1]].ans + e[x].v) % mod;
}
inline void muldown(int x,ll k)
{
	e[x].laz1 = e[x].laz1 * k % mod;
	e[x].laz2 = e[x].laz2 * k % mod;
	e[x].ans = e[x].ans * k % mod;
	e[x].v = e[x].v * k % mod;
}
inline void adddown(int x,ll k)
{
	e[x].ans = (e[x].ans + e[x].siz * k) % mod;
	e[x].laz1 = (e[x].laz1 + k) % mod;
	e[x].v = (e[x].v + k) % mod;
}
inline void rotdown(int x)
{
	int bot = e[x].son[0];
	e[x].son[0] = e[x].son[1];
	e[x].son[1] = bot;
	e[x].rot ^= 1;
}
inline void pushdown(int x)
{
	if (e[x].laz2 != 1)
	{
		muldown(e[x].son[0],e[x].laz2);
		muldown(e[x].son[1],e[x].laz2);
		e[x].laz2 = 1;
	}
	if (e[x].laz1)
	{
		adddown(e[x].son[0],e[x].laz1);
		adddown(e[x].son[1],e[x].laz1);
		e[x].laz1 = 0;
	}
	if (!e[x].rot) return;
	rotdown(e[x].son[0]);
	rotdown(e[x].son[1]);
	e[x].rot = 0;
}
inline void rotate(int x)
{
	int y = e[x].fa,z = e[y].fa,mode = e[y].son[0] == x;
	if (!pdroot(y)) e[z].son[e[z].son[1] == y] = x;
	e[x].fa = z;
	e[y].son[mode ^ 1] = e[x].son[mode];
	e[e[x].son[mode]].fa = y;
	e[x].son[mode] = y;
	e[y].fa = x;
	update(y);
	update(x);
}
inline void change(int x)
{
	if (!pdroot(x)) change(e[x].fa);
	pushdown(x);
}
inline void splay(int x)
{
	change(x);
	while (!pdroot(x))
	{
		int y = e[x].fa,z = e[y].fa;
		if (!pdroot(y)) {
			if ((e[z].son[0] == y) ^ (e[y].son[0] == x)) rotate(x);
			else rotate(y);
		} rotate(x);
	}
}
inline void access(int x)
{
	for (int y = 0 ; x ; y = x,x = e[x].fa)
	{
		splay(x);
		e[x].son[1] = y;
		update(x);
	}
}
inline void makeroot(int x)
{
	access(x);
	splay(x);
	rotdown(x);
}
inline void link()
{
	int x = r(),y = r();
	makeroot(x);
	e[x].fa = y;
}
inline void delink()
{
	int x = r(),y = r();
	makeroot(x);
	access(y);
	splay(y);
	e[x].fa = 0;
	e[y].son[0] = 0;
	update(y);
	link();
}
inline void add()
{
	int x = r(),y = r();
	makeroot(x);
	access(y);
	splay(y);
	ll k = r();
	adddown(y,k);
}
inline void mul()
{
	int x = r(),y = r();
	makeroot(x);
	access(y);
	splay(y);
	ll k = r();
	muldown(y,k);
}
inline void get()
{
	int x = r(),y = r();
	makeroot(x);
	access(y);
	splay(y);
	printf("%d\n",e[y].ans);
}
int main()
{
	int n = r(),q = r(),x,y;
	for (int a = 1 ; a <= n ; ++ a)
	{
		e[a].v = 1;
		e[a].siz = 1;
		e[a].laz2 = 1;
	}
	for (int a = 1 ; a < n ; ++ a) link();
	char w[1 << 2];
	while (q--)
	{
		scanf("%s",w);
		switch (w[0])
		{
			case '-':delink();break;
			case '+':add();break;
			case '*':mul();break;
			case '/':get();break;
		}
	}
	return 0;
}

 

搞其他东西去了惹qwq

linux arm64 Debian12移植操作手册 2023年6月10号Debian官方出了debian12 arm64版本的。如果需要完全适配这个系统的话,需要linux6.10版本。应客户的需求,需要在Debian11升级为Debian12版本。 阅读详情

相关推荐

银河麒麟V10-ARM架构-postgresql安装与部署指南

本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。提示:以下是本篇文章正文内容,下面案例可供参考银河麒麟系统安装程序比较繁琐,潜在问题比较多,个人建议均通过源码自定义编译安装。国产系统还需努力啊!

idols_man的博客 1万+

动态树之Link-Cut-Tree(LCT)详解

树是指一类问题,通常要求对一片森林进行路径查找与修改、增删边、维护连通性、路径上的权值和等信息等操作,它与树链剖分的区别在于需要维护边的删除和添加。动态树有很多种解决方法,我们今天只介绍适用范围最广、最常用的一种解法:Link-Cut-Tree(LCT)。

GROZAX的博客 899

2080Ti双卡开启NVLink

本文介绍了如何在Ubuntu 22.04系统下给2080Ti双卡开启NVLink的方法。

flymyd的博客 2901

数据结构专题——动态树

顾名思义,动态树是动态的,动态树维护了若干无序的有根树(实际上是无根的,操作过程中拓扑序不变)组成的森林.动态树,支持树上的节点到根节点的操作(树链剖分能够维护的信息),同时动态树能够高效的实现换根、加减边、森林中树的合并分裂(这是树剖无法高效实现的),这里介绍的均为 LCT(Link−Cut Trees)LCT(Link-Cut\ Trees)LCT(Link−Cut Trees).树链剖分一般指轻重链剖分,通过把树划分不同的链,然后在线段树上维护树上的信息;这里的 LCTLCTLCT 是虚实链剖分,每个

m0_52766855的博客 2288

python——体育收入排行2012-2019

请分析文件并读取数据,完成以下功能: 1. 某年的收入排名前若干名选手 如果输入n是2012-19之间的年份,则可以输入整数k,输出n年的前k名排名信息。如果k大于当年排名运动员人数,则输出当年所有的信息。每行一名运动员信息,以' | '间隔该行各项信息。 2. 某年属于某个运动项目的所有运动员信息,和收入总和 如果输入的是'sport'(不区分大小写),则可以继续输入一个年份201*,输出一个当年排行中的运动项目菜单,按照字符串升序排列,格式见示例,再输入运动项目对应的数字来输出该项运动当

m0_62488776的博客 2257

TP4054充电电路发热严重?手把手教你调整电阻值降低温度(附实测数据)

本文针对TP4054锂电池充电电路发热严重的问题,提供了详细的排错与解决方案。通过分析发热原理,指出核心在于PROG引脚电阻值设定,并手把手指导如何计算和选择正确的电阻以降低充电电流与温度。文末附有不同电阻下的实测温度与性能数据,为电子爱好者和工程师提供了实用的调试参考。

p4q5r6s7t的博客 406

Link-Cut-Tree 动态树算法

Link-Cut-Tree 动态树算法总结 动态树是一类要求维护森林连通性的算法总称,其中最常用的就是lct (Link-Cut-Tree). lct 支持一下操作 链上求和  链上求最值 链上修改 (前三项均可用树链剖分+线段树实现) 断开树上的一条边 连接两个点,保证连接后仍然是一棵树 判断森林连通性 说到lct,自然需要引入一些概念: Prefer

clover_hxy的博客 1778

calibration的“前世今生”——从simulink开发到CANape的XCP标定

整体思路 备注: elf可简单的看作为hex和map的集合,其中包括可执行的程序、变量及其对应的地址(simulink生成代码是也可以勾选生成ASAP2的a2l文件,有变量但变量对应的地址为空,只有编译后才分配地址) 定义变量是观测值还是标定值需要在simulink中的数据字典定义变量存储类型,详见simulink系列。 1. 前期准备A2L的制作 安装完成CanApe软件 , 插上CanApe硬件( 如:vector 1640A)。打开A2L编辑软件 ASAP2 Editor(注意不是ASAP2 Vi

IHTY_NUI的博客 1万+

Link-Cut-Tree

linkcuttree

ID246783的博客 903

【国密】基于SM2的协同签名与协同解密方案

两方协同签名指客户端与服务端协同完成签名、验签操作,具体实现方案参考了信工所专利[3]。在业务应用中,两方或多方的协同签名一般采用门限签名方案可以用来构造。门限密码算法在多方协作的相关场景中应用十分广泛,可以实现数据联合授权、认证、密钥安全恢复、密钥安全交换等需求,在诸多分布式多方计算协议中均可见其身影。在上述两方协同签名方案中,最巧妙的地方在于签名值s分量的构造,通过一些列数学变换,得以恢复。以下从两方协同签名方案介绍入手,介绍门限密码在协同签名中的应用。解决上述问题的关键在于门限密码算法的巧妙构造。

听雨草堂 8391

Amazon Skills:51个AI技能赋能亚马逊运营,从选品到广告全链路分析

在电商运营领域,数据分析和自动化工具正成为提升效率的关键。其核心原理在于将专业经验转化为结构化指令,使AI能够执行标准化流程。这种技术价值体现在降低专业门槛、提升决策效率,尤其适用于亚马逊这类数据驱动的电商平台。通过将选品、关键词研究、FBA费用计算、PPC广告优化等运营框架编码为可执行指令,AI助手能够模拟专家思维进行市场分析。Amazon Skills项目正是这一理念的实践,它提供51个覆盖运营全链路的技能模块,让卖家在自然对话环境中获得专业分析支持,实现从市场研究到利润核算的自动化工作流。

weixin_27134143的博客 1304

link-cut tree

自己简单研究了下动态树,就先来一发博客吧 动态树问题 link cut tree 实现的技巧

Tgop_Knight的专栏 4513

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

动态树 LCT(Link-Cut-Tree)--入门教程

什么是LCT(Link-Cut-Tree)根据杨哲先生的论文(QTREE),可以得知,动态树问题是一类问题的统称,而解决这种问题最常用到的数据结构就是LCT(Link-Cut-Tree)。LCT的大体思想类似于树链剖分中的轻重链剖分,轻重链剖分是处理出重链来,由于重链的定义和树链剖分是处理静态树所限,重链不会变化,变化的只是重链上的边或点的权值。由于这个性质,我们用线段树来维护树链剖分中的重链,但是

yashem66 4657

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

P3690 【模板】Link Cut Tree (动态树lct)

学习资源 https://www.cnblogs.com/flashhu/p/8324551.html 中序遍历Splay得到的每个点的深度序列严格递增 题目 P3690 【模板】Link Cut Tree (动态树) 数组版代码 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int n, m, k; namespace LCT { // lct板子 int v[N];// 点权

Yubing792289314的博客 308

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

动态树Link-cut tree(LCT)总结

动态树是个好玩的东西 LCT题集 预备知识 Splay 树链剖分(好像关系并不大) 动态树(Link-cut tree) 先搬dalao博客 什么是LCT? 动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作。其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT(link-cut tree)。 LCT的...

weixin_30925411的博客 180

动态树之LCT(link-cut tree)讲解

by:http://www.cnblogs.com/BLADEVIL/p/3510997.html   动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作。其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT(link-cut tree)。  LCT的大体思想类似于树链剖分中的轻重链剖分,轻重链剖分是处理

wang_sj的博客 677

【用皇宫三十六计生存法则带你走进LCT(动态树)】LCT概念+模板+例题【洛谷P3690 Link Cut Tree(动态树)】

这样学知识那可太好玩了

942

专题总结:动态树 LCT(Link cut tree)

HUST开的一套动态树专题,全是经典题:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25242#overview 先说一下什么是动态树。动态树可以维护一个动态的森林,支持树的合并(两棵合并成一棵),分离(把某个点和它父亲点分开),动态LCA,树上的点权和边权维护、查询(单点或者树上的一条路径),换根。 这里首先

NOI2015的专栏 1217

动态树 Link Cut Tree【模板】【LCT】

>Link luogu P3690 >Description 给定 n 个点以及每个点的权值,要你处理接下来的 m 个操作。 操作有四种,操作从 0 到 3 编号。点从 1 到 n 编号。 x y 代表询问从 x 到 y 的路径上的点的权值的 xor 和。保证 x 到 y 是联通的。 x y 代表连接 x 到 y,若 x 到 y 已经联通则无需连接。 x y 代表删除边 (x,y),不保证边 (x,y) 存在。 x y 代表将点 x 上的权值变成 y。 n≤105,m≤3∗105n\le1

//(^ o ^)// 230

【LCT】一步步地解释Link-cut Tree

简介   Link-cut Tree,简称LCT。   干什么的?它是树链剖分的升级版,可以看做是动态的树剖。   树剖专攻静态树问题;LCT专攻动态树问题,因为此时的树剖面对动态树问题已经无能为力了(动态树问题通常夹杂着树的操作,如删边与连边。这是线段树无法应对的)。   LCT难写吗?不难写啊!真的没有200行......   让我们用简洁的写法来搞定LCT:只需要一些基础函数,再疯

zy5757的博客 794

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作。操作有4种。操作从0到3编号。点从1到N编号。 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。 1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接。 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。 ...

dirushi6322的博客 155

LCT (link cut tree)动态树学习

LCT (link cut tree)动态树学习

qq_61305213的博客 341

浅谈算法——LCT

前置技能 splay: 必须 树链剖分: 可选,知道树链剖分会容易理解一些。 以下大部分图片来自https://blog.youkuaiyun.com/saramanda/article/details/55253627 Link Cut Tree(LCT) LCT,又叫林克-卡特树,可以用来解决动态树问题。 LCT显然是一棵树,它长这样: 这上面有一些粗一点的边,我们把它称为重边;还有...

Canopus 6744

LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换。 LCT总结——应用篇戳这里 概念、性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改、查询等操作的复杂度。 目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分 重链剖分 实际上我们经常讲的树剖,就是重链剖分...

a83229442的博客 280

【Link Cut Tree 模板】洛谷P3690 动态树 LCT 模板

题目戳这里 本模板是从网上复制来的。 操作如下: access(x,y),将x到y的路径连上实边,其他儿子都变成虚边。 link(x,y),将x和y连起来。 cut(x,y),将x和y断开。 对于修改操作,若将点x的权值修改成y,只需splay(x)然后v[x] = y即可。 findroot(x)==findroot(y)表示连通。 makeroot(x)表示将x选为跟。 split(x,y),...

KIKO_caoyue的博客 299

洛谷 P3690 【模板】Link Cut Tree (动态树)—— LCT模板,快读,O2优化

This way 题意: 给你一些点,每次都会连边删边,问你从x到y的路径异或和为多少 题解: LCT模板 存个模板 搞来搞去还是原版的快。。 为什么x和y相同的时候还需要连边删边??? 判的话就错了? #include<bits/stdc++.h> #define G if(++ip==ie)if(fread(ip=buf,1,SZ,stdin)) #pragma GCC optim...

天翼之城的博客 352
上一篇: JZOJ 5344【NOIP2017模拟9.3A组】摘果子
下一篇: 分层图最短路(SPFA)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值