洛谷T160512 G - 森林(并查集)

2023-10-27

在这里插入图片描述
题目思路:
按照正常的并查集思路来想的话,对于操作一 分裂成两颗树后,比较难维护的是其中一颗子树的所有子节点的祖先节点 因为 在find找祖先节点的时候会找到分裂前的的那个祖先节点,如果给每个子节点都更改的话,复杂度不允许
但是,如果我们把删边变为加边的话,这个并查集维护起来就比较方便了 ,我们从这颗树的最终状态向前操作
操作一 删边变为加边
操作二 值的变换,颠倒一下顺序(这里可以用记录一个节点的数值变化顺序)

Code:

int n,m,val[maxn],u[maxn],v[maxn],p[maxn],pre[maxn],ans[maxn],res;
int s[maxn],vis[maxn],op[maxn],x[maxn],y[maxn];
stack<int>q[maxn];

int find(int x) {
	if(x==p[x]) return x;
	return p[x] = find(p[x]);
}
void combine(int x,int y) {
	int dx = find(x);
	int dy = find(y);
	if(dx!=dy) p[dy] = dx,s[dx]+=s[dy];
}

int main() {
	n=read(),m=read();
	for(int i=1 ; i<=n ; i++) {
		int x= read();
		p[i]= i;
		q[i].push(x);
	}
	for(int i=1 ; i<=n-1 ; i++) 	u[i] =read(),v[i] = read();
	for(int i=1 ; i<=m ; i++) {
		op[i]= read();
		if(op[i]==1) x[i] =read(),vis[x[i]] = 1;
		else if(op[i]==2) x[i] =read(),y[i] =read(),q[x[i]].push(y[i]);
		else if(op[i]==3) x[i] =read();
	}

	for(int i=1 ; i<=n ; i++) s[i] = val[i] = q[i].top(),q[i].pop();
	
	for(int i=1 ; i<=n-1 ; i++) {
		if(vis[i]) continue;
		combine(u[i],v[i]);
	}

	for(int i=m ; i>=1 ; i--) {
		if(op[i]==1) {
			combine(u[x[i]],v[x[i]]);
		} else if(op[i]==2) {
			int temp = q[x[i]].top();
			q[x[i]].pop();
			int t = temp-val[x[i]] ;
			s[find(x[i])]+=t;
			val[x[i]] = temp;
		} else if(op[i]==3)	ans[++res] = s[find(x[i])];
	}
	dep(i,res,1) printf("%d\n",ans[i]);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洛谷T160512 G - 森林(并查集) 的相关文章

随机推荐

  • c++实现Qt信号和槽机制

    文章目录 简介 信号 槽 信号与槽的连接 特点 观察者模式 定义 观察者模式结构图 实现简单的信号和槽 简介 信号槽机制与Windows下消息机制类似 消息机制是基于回调函数 Qt中用信号与槽来代替函数指针 使程序更安全简洁 信号和槽机制是
  • fmincon求解函数极值

    clear close all options fun1 46 971 5 094 x 1 80 234 x 2 0 173 x 1 2 46 994 x 2 2 3 695e 5 x 3 2 3 056 x 1 x 2 0 001 x 1
  • windows 下C++生成Dump调试文件与分析

    目录 1 前言 2 依赖库下载 3 项目配置 3 1 设置输出路径 3 2 拷贝依赖资源 3 3 将dbghelp h添加在工程中 3 4 配置lib文件路径 3 5 添加生成minidump文件方法 4 测试效果 5 打开dump文件进行
  • 提升网络安全防御能力的几个方面

    提升网络安全防御能力对于个人和组织来说都至关重要 网络安全是一个全面的概念 包括保护个人信息 防止恶意攻击和确保网络资源的安全 在这篇文章中 我将介绍几个方面来提高网络安全防御能力其中包括IP地址查询 首先 IP地址查询是一种网络安全工具可
  • C均值(K-means)聚类算法 实验

    文章目录 一 实验目的 二 实验原理 三 实验内容 四 实验步骤 1 1 随机创建100个样本的二维数据作为训练集并画出训练样本的散点图 1 2 3 进行聚类并画出聚类结果的散点图 2 1 导入iris数据集数据 2 2 3 进行聚类并画出
  • ROS系统开发——ROS,realsense风险和解决方案备忘录

    未能确认原因的重大风险问题 开启4个相机时 有时候会出现只能打开2个 或3个相机的情况 还有一个相机无法开启 2021 3 23 详细现象 长时间测试4个realsense相机过程中 使用roslaunch命令同时开启4个相机时 有时候随机
  • 【List】类型检查

    public static
  • @TableId(value = “id“,type = IdType.AUTO) 设置后无效的解决办法

    TableId value id type IdType AUTO TableId value id type IdType INPUT 刚开始自增一直是32位的 TableId value id type IdType AUTO priv
  • 如何查看中科院分区

    中科院分区和JCR分区查询 jcr分区查询官网 xing meng的博客 CSDN博客
  • 如何让自动化测试框架更自动化?

    一 引言 对于大厂的同学来说 接口自动化是个老生常谈的话题了 毕竟每年的MTSC大会议题都已经能佐证了 不是大数据测试 就是AI测试等等 越来越高大上了 不可否认这些专项的方向是质量智能化发展的方向 但是凡事都遵循2 8定律 80 的从事软
  • oracle中exp/imp命令详解

    ORACLE数据库有两类备份方法 第一类为物理备份 该方法实现数据库的完整恢复 但数据库必须运行在归挡模式下 业务数据库在非归挡模式下运行 且需要极大的外部存储设备 例如磁带库 第二类备份方式为逻辑备份 业务数据库采用此种方式 此方法不需要
  • 使用OpenCV+Python进行图像处理的初学者指南

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 介绍 我们都知道一句话 每张照片都可以告诉我们一个故事 图像中可能隐藏着很多信息 我们可以用不同的方式和视角来解释它 那么 什么是图像 如何处理图像 简而言之 我们可以说
  • 类加载机制—详解

    1 类加载 class 文件中都是一个一个的二进制 通过前面个两个字节进行判断 2 双亲委托机制 class 文件通过类加载器进入到 JVM虚拟机中运行 2 1类加载器 类加载器分为两种 一种是引导类加载器 启动类加载器是已经提供好的 一种
  • 世间万物,音乐不可辜负

    世间万物 唯有爱不可辜负 爱 除了来自家人的亲情 恋人的爱情 朋友的友情 爱 还来自你对世间万物的感受 比如 美食 通过嗅觉 品尝到美味 又比如音乐 通过听觉 调动你的情绪 激发你的想象力 共情能力 愉悦你的身心 安慰你 鼓励你 今天 跟大
  • 大数据实战 Linux Ubuntu 20.04.1 server 最小化安装及其网络配置

    1 Uduntu 的诞生 Ubuntu是一个以桌面应用为主的Linux操作系统 其名称来自非洲南部祖鲁语或豪萨语的 ubuntu 一词 意思是 人性 我的存在是因为大家的存在 是非洲传统的一种价值观 buntu Linux是由南非人马克 沙
  • 【Linux篇】fwrite函数

    include
  • 深入理解 synchronized 关键字

    看书的时候 看到这里 觉得有必要记录一下 那就顺手写一下 先看一下 synchronized 的官方解释的翻译 synchronized 关键字可以实现一个简单的策略来防止线程干扰和内存一致性错误 如果一个对象对多个线程是可见的 那么该对象
  • node.JS之中转服务器

    经过前面node的学习 我们对node已经有了一定的了解下面我直接上中转服务器实现过程和思路说明 let http require http let https require https var iconv require iconv l
  • mysql的binlog详解

    author skate time 2012 03 27 mysql的binlog详解 什么是binlog binlog日志用于记录所有更新了数据或者已经潜在更新了数据 例如 没有匹配任何行的一个DELETE 的所有语句 语句以 事件 的形
  • 洛谷T160512 G - 森林(并查集)

    题目思路 按照正常的并查集思路来想的话 对于操作一 分裂成两颗树后 比较难维护的是其中一颗子树的所有子节点的祖先节点 因为 在find找祖先节点的时候会找到分裂前的的那个祖先节点 如果给每个子节点都更改的话 复杂度不允许 但是 如果我们把删