[BZOJ4530][Bjoi2014]大融合 LCT + 启发式合并

[BZOJ4530][Bjoi2014]大融合

试题描述

小强要在N个孤立的星球上建立起一套通信系统。这套通信系统就是连接N个点的一个树。
这个树的边是一条一条添加上去的。在某个时刻,一条边的负载就是它所在的当前能够
联通的树上路过它的简单路径的数量。
例如,在上图中,现在一共有了5条边。其中,(3,8)这条边的负载是6,因
为有六条简单路径2-3-8,2-3-8-7,3-8,3-8-7,4-3-8,4-3-8-7路过了(3,8)。
现在,你的任务就是随着边的添加,动态的回答小强对于某些边的负载的
询问。

输入

第一行包含两个整数N,Q,表示星球的数量和操作的数量。星球从1开始编号。
接下来的Q行,每行是如下两种格式之一:
A x y 表示在x和y之间连一条边。保证之前x和y是不联通的。
Q x y 表示询问(x,y)这条边上的负载。保证x和y之间有一条边。
1≤N,Q≤100000

输出

对每个查询操作,输出被查询的边的负载。

输入示例

8 6
A 2 3
A 3 4
A 3 8
A 8 7
A 6 5
Q 3 8

输出示例

6

题解

LCT + 启发式合并

我不敢直接用LCT直接维护有根树的子树size值,所以每次合并用启发式合并暴力将较小的连通块dfs重构(其实就是换根),再插到另一个连通块中。

当树Tree1的树根要作为另一棵树Tree2中节点u的儿子时,需要将Tree2中节点u到根节点的路径上每个节点的权值加上Tree1的大小,这是一个链上的问题,可以用LCT解决。(代码后附有更强的样例)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std;const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *tail;
inline char Getchar() {if(Head == tail) {int l = fread(buffer, 1, BufferSize, stdin);tail = (Head = buffer) + l;}return *Head++;
}
int read() {int x = 0, f = 1; char c = Getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }return x * f;
}#define maxn 100010
#define maxm 200010
#define LL long long
int n, q, m, head[maxn], nxt[maxm], to[maxm];
void AddEdge(int a, int b) {to[++m] = b; nxt[m] = head[a]; head[a] = m;swap(a, b);to[++m] = b; nxt[m] = head[a]; head[a] = m;return ;
}int pa[maxn], siz[maxn];
int findset(int x) { return x == pa[x] ? x : pa[x] = findset(pa[x]); }int fa[maxn], ch[maxn][2], val[maxn], addv[maxn];
bool isroot(int u) { return ch[fa[u]][0] != u && ch[fa[u]][1] != u; }
void pushdown(int u) {int l = ch[u][0], r = ch[u][1];if(addv[u]) {addv[l] += addv[u]; addv[r] += addv[u];val[l] += addv[u]; val[r] += addv[u];addv[u] = 0;}return ;
}
void maintain(int u) {return ;
}
void rotate(int u) {int y = fa[u], z = fa[y], l = 0, r = 1;if(ch[y][1] == u) swap(l, r);if(!isroot(y)) ch[z][ch[z][1]==y] = u;fa[u] = z; fa[y] = u; fa[ch[u][r]] = y;ch[y][l] = ch[u][r]; ch[u][r] = y;maintain(y); maintain(u);return ;
}
int S[maxn], top;
void splay(int u) {S[++top] = u;for(int t = u; !isroot(t); t = fa[t]) S[++top] = fa[t];while(top) pushdown(S[top--]);while(!isroot(u)) {int y = fa[u], z = fa[y];if(!isroot(y)) {if((ch[y][0] == u) ^ (ch[z][0] == u)) rotate(u);else rotate(y);}rotate(u);}return ;
}
void access(int u) {for(int t = 0; u; u = fa[u]) {splay(u); ch[u][1] = t; maintain(u); t = u;}return ;
}
void add(int u, int v) {access(u); splay(u); addv[u] += v; val[u] += v;return ;
}
int query(int u) {access(u); splay(u);return val[u];
}
void rebuild(int u) {ch[u][0] = ch[u][1] = 0;val[u] = 1;for(int e = head[u]; e; e = nxt[e]) if(to[e] != fa[u]) {fa[to[e]] = u;rebuild(to[e]);val[u] += val[to[e]];}return ;
}int main() {n = read(); q = read();for(int i = 1; i <= n; i++) pa[i] = i, val[i] = siz[i] = 1;while(q--) {char tc = Getchar();while(!isalpha(tc)) tc = Getchar();int u = read(), v = read();if(tc == 'A') {int a = findset(u), b = findset(v);if(siz[a] > siz[b]) swap(a, b), swap(u, v);pa[a] = b; siz[b] += siz[a];fa[u] = v; AddEdge(u, v);rebuild(u);
//			printf("siz[%d] val[%d]: %d %d\n", b, u, siz[b], val[u]);add(v, siz[a]);}if(tc == 'Q') {LL x = (LL)min(query(u), query(v));
//			printf("%d %d\n", query(u), query(v));printf("%lld\n", x * (siz[findset(u)] - x));}}return 0;
}
/*
in:
8 14
A 2 3
Q 2 3
A 3 4
Q 2 3
A 3 8
Q 3 8
A 8 7
Q 3 4
A 6 5
Q 5 6
Q 3 8
A 1 6
A 1 8
Q 1 8
out:
1
2
3
4
1
6
15
*/

 

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5392139.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

器件篇:步进电机

器件篇&#xff1a;步进电机 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下&#xff0c;电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数&#xff0c;而不受负载变化的影响&#xff0c;当步进驱动器接收到一个脉冲信号&#xf…

pytorch中的参数初始化方法

参数初始化&#xff08;Weight Initialization&#xff09; PyTorch 中参数的默认初始化在各个层的 reset_parameters() 方法中。例如&#xff1a;nn.Linear 和 nn.Conv2D&#xff0c;都是在 [-limit, limit] 之间的均匀分布&#xff08;Uniform distribution&#xff09;&…

物理学走到尽头了吗?

图片来源&#xff1a;pixabay.com来源&#xff1a; 蔻享学术我的英雄理查德费曼&#xff08;Richard Feynman&#xff09;曾开玩笑地说&#xff1a;“爱因斯坦是个巨人。他的头虽然在云里&#xff0c;脚却踩在地上。而我们这些个子不高的人则必须做出一个选择&#xff01;”可我…

QT示例:基于TCP点对点Socket通讯

QT示例&#xff1a;基于TCP点对点通讯一、 概述二、TCP 协议工作原理三、TCP 编程模型四、基于TCP点对点通讯示例1、客户端2、客户端Client示例3、服务器4、服务器server示例下载&#xff1a;基于TCP点对点通讯 一、 概述 二、TCP 协议工作原理 三、TCP 编程模型 四、基于TCP点…

50 年人类登月史:那些不为人知的故事

来源&#xff1a; CSDN2019年7月20日是纪念人类登月五十周年的好日子。人类于1969年首次正式登上月球&#xff0c;历史将永远铭记两位宇航员的名字&#xff1a;尼尔阿姆斯特朗与巴兹奥尔德林。 然后&#xff0c;这背后还有很多不为人知的故事。 在我们庆祝首次登月成功的同时&a…

物理学走到尽头了吗 | 维尔切克专栏

来源&#xff1a;环球科学撰文 | 弗兰克维尔切克&#xff08;Frank Wilczek&#xff09;翻译 | 胡风 梁丁当“物理学家沉迷于追求数学的优美&#xff0c;却正在丧失解决新问题的能力。” “顶级的物理学家不再关心物理现实——当然他们也不用关心这些。” “科学完了。”这几句…

C# “配置系统未能初始化” 异常解决

使用App.config配置参数&#xff0c;读取参数出现错误 “System.Configuration.ConfigurationErrorsException”类型的未经处理的异常在 System.Configuration.dll 中发生 其他信息: 配置系统未能初始化 验证App.config文件没有结构错误 解决办法&#xff1a; 如果配置文件中包…

从零到无穷——美国数学的崛起之路

来源&#xff1a;今日头条从十七世纪开始&#xff0c;大批各种各样的欧洲移民开始涌入北美新大陆&#xff0c;也是从这个时候开始&#xff0c;科技革命的号角在欧洲开始吹响。但在相当长的一段时间内&#xff0c;北美大陆的居民仍在为生存而挣扎&#xff0c;像数学这样的科学在…

IAR STM32报错Error[Pe147]:declaration is incompatible with“__nounwind __interwork __softfp unsigned

IAR STM32工程中报错&#xff1a; Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned int __iar_builtin_REV16(unsigned int)" (declared at line 197 of "D:\STM32F103_Demo\Core\core_cm3.h 解决方法&#xff1…

JAVA设计模式之工厂模式

在面向对象编程中&#xff0c; 最通常的方法是一个new操作符产生一个对象实例&#xff0c;new操作符就是用来构造对象实例的。但是在一些情况下&#xff0c;new操作符直接生成对象会带来一些问题。举例来说&#xff0c;许多类型对象的创造需要一系列的步骤&#xff1a;你可能需…

纳米片晶体管是摩尔定律的下一步,也许是最后一步!

来源&#xff1a;云头条作者&#xff1a;Peide Ye是普渡大学的Richard J.和Mary Jo Schwartz电气与计算机工程教授&#xff0c;Thomas Ernst是法国格勒诺布尔CEA-Leti的科学主任&#xff0c;Mukesh V. Khare是IBM研究中心的半导体和AI硬件副总裁。纳米片器件计划最快在2021年用…

IAR STM32工程报错Error[Pe020]: identifier “GPIO_Pin_0”is undefined D:\STM32F103_Demo\App\main.c

IAR STM32工程报错&#xff1a; Error[Pe020]: identifier "GPIO_Pin_0" is undefined D:\STM32F103_Demo\App\main.c 解决方法&#xff1a; 右键下图工程名选择Options 在预处理里面加上下面这行

脑机接口技术的现状与未来!

来源&#xff1a;芯智讯一、前言通过在脑后插入一根线缆&#xff0c;我们就能够畅游计算机世界&#xff1b;只需一个意念我们就能改变“现实”&#xff1b;学习知识不再需要通过书本、视频等媒介&#xff0c;也不需要在花费大量的时间&#xff0c;只需直接将知识传输到大脑当中…

学籍管理系统系统流程图

转载于:https://www.cnblogs.com/whitelip/p/5406976.html

崛起的超级智能:是否会是下一个“麦克卢汉式”预言?

腾讯科技21世纪以来&#xff0c;前沿科技领域呈爆发式增长&#xff1a;从云计算到区块链、从谷歌大脑到华为EI智能体、从工业大脑到农业大脑、从城市神经网络到智慧社会……各种新技术和新概念层出不穷&#xff0c;如潮水般不断涌现&#xff0c;无论业界学界还是行业产业&#…

HttpClient Get/Post方式调用Http接口

HttpClient Get/Post方式调用Http接口 本节摘要:本节主要分别介绍如何用get方式、post方式向http接口发送数据。 preparation 1. 项目环境如下&#xff1a; myeclipse6.5 、tomcat5.0、system:xp、JDK:开发1.5&#xff0c;编译1.4 为了方便,在原来的web项目UpDown中新建了一个h…

python对Excel的操作 xlrd、xlwt包详解

文章更新中............. python中对Excel表格的操作&#xff0c;主要用到两个包&#xff0c;分别是xlrd和xlwt 1.xlrd主要用于读Excel表 2.xlwt则主要用于写Excel python—xlrd 这里我先准备了一些济南天气的一些数据通过python程序先对数据有一个基本的了解&#xff1a; path…

人造细胞能模仿天然细胞感知环境

来源&#xff1a;科技日报据英国帝国理工学院官网近日消息&#xff0c;该校一个研究团队成功开发出一种新型人造细胞&#xff0c;能够模仿天然细胞感知环境中的化学变化并产生反应。如果在未来发展成熟&#xff0c;这项技术可广泛用于生物科技等领域。相关成果已刊登在近期美国…

FileNotFoundError: [Errno 2] No such file or directory: 'test/条形图03.html'

这几天一直在搞百度的一个可视化的工具Echart&#xff0c;感觉确实挺不错的&#xff0c;比matplotlib的可视化好看多了。 今天遇到了两个问题 1、如何导入pyecharts中的get_all_options工具 解决方法&#xff1a; from pyecharts.echarts.option import get_all_options 2、在进…

感觉皮层实质性参与工作记忆的信息保存

来源&#xff1a;脑智卓越创新中心7月17日&#xff0c;《eLife》期刊在线发表了题为《感觉皮层实质性参与工作记忆的信息保存》的研究论文。该研究由中国科学院脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;、上海脑科学与类脑研究中心、神经科学国家重…