怎样做网站初中生/网络营销主要内容

怎样做网站初中生,网络营销主要内容,pcms网站开发,做日本外贸网站设计典型例题 Acwing 权值 故名思义,在带权并查集中,我们需要让每个节点携带一个**“权值”**。 那么这个权值应该是什么呢?其实答案就在并查集当中。 由于在并查集当中我们可以在 O ( 1 ) O(1) O(1) 时间内找到一个节点的根节点,那…

典型例题

Acwing

权值

故名思义,在带权并查集中,我们需要让每个节点携带一个**“权值”**。
那么这个权值应该是什么呢?其实答案就在并查集当中。
由于在并查集当中我们可以在 O ( 1 ) O(1) O(1) 时间内找到一个节点的根节点,那么我们可以让这个权值表示为:某个节点到根节点的距离

如何维护权值

首先我们需要一个“懒标记数组 d d d”,至于为什么称其为“懒标记”,稍后再解释。这个数组就是用来记录我们权值的数组。
即, d [ i ] d[i] d[i] 表示 i i i 到根节点的距离。
其次,我们需要在 f i n d find find 函数中做一点手脚。这个也稍后解释,

懒标记数组和find()

明明就是用来维护权值的数组,为什么我们要称其为懒标记呢?
试想一下,当我们将以 f b fb fb 为根的集合添加到以 f a fa fa 为根的集合的尾部,我们是需要修改以 f b fb fb 为根的子树集合里面所有点的 d [ ] d[] d[] 的,是不是想象就可怕呢?
好,现在我们试着正经分析一下,如果我们真的要一次性修改以 f b fb fb 为根的子树集合中的所有点,有什么办法可以得到这些点吗?
贪心的想,我们肯定希望直接找到集合中的所有点,然后修改,但这是不可能的!由于我们在并查集中只能找到根节点,而不能从根节点找孩子节点,所以我们只能遍历所有点,判断每一个点所在的集合是否为 f b fb fb,这么做的时间复杂度为 O ( N ) O(N) O(N),如果执行 N N N 次这样的操作,就是平方级别的复杂度!这肯定无法接受!
但我们又无法回避这个问题,该如何做呢? – 参考线段树中懒标记的做法
当我们需要修改以 f b fb fb 为根的集合中所有点的权值时,我们只修改该集合根节点 f b fb fb 的权值,然后其余的点我们不做操作!
等我们对集合中的某个点 x x x(不是该集合的根节点) 执行 f i n d find find 操作时, f i n d find find 会找到 x x x 的所有父节点,直到根节点。
我们发现,我们找到了一条从直接从底层节点到根节点的路径,并且寻找这个路径的过程是递归的(线性)!
既然递归的路径是从底到根,那么回溯时的路径必然是从根到底,而从根到底的过程就可以找到根的所孩子,这些孩子就是该根所在集合中的子树节点!
这个时候(回溯),就可以用来修改我们的懒标记,将他们变成正确的值。
并且,从根到底的回溯也能保证答案的正确性,因为当某个节点的根被修改时,它所有的子节点也需要修改,子树的值依赖于它的根的值,因此保证根的正确性,才能保证底的正确性。
例如,我们让根节点指向一个新的根节点,那么不仅原来的根节点的 d [ ] d[] d[] 变化了,它的所有子节点的 d [ ] d[] d[] 也需要变化。
最后,还有一个疑问?如果你每次 f i n d ( x ) find(x) find(x) 都会修改 x x x 到树根的路径上的 d d d,那么会不会导致一个点被重复多次修改,导致它的 d [ ] d[] d[] 比实际更大呢?
答案是不会的,因为在第一次 f i n d ( x ) find(x) find(x) 之后, x x x 会因为路径压缩,直接指向树的根节点,这样当下一次再 f i n d ( x ) find(x) find(x) 时,会直接返回 p r e [ x ] pre[x] pre[x],不会涉及到清除懒标记(修正它的 d [ ] d[] d[])这一步。

图解

IMG
顺便解释一下清除懒标记(修正 d [ ] d[] d[])的公式:d[x] = d[x] + d[pre[x]]
具体含义:一个节点到根节点的距离 = 它到父节点的距离 + 父节点到根节点的距离
因此,在修正一个节点 x x x 时,我们需要先修正它的父节点 p r e [ x ] pre[x] pre[x] 到树根的 d [ p r e [ x ] ] d[pre[x]] d[pre[x]],这一点从公式也可以清晰的看出
这也就是我们在 f i n d ( x ) find(x) find(x)int root = find(pre[x]); 做的事情,如果写的更清楚一点,那就是:

int find(int x)
{if(pre[x] == x) return x;  // 原本的findfind(pre[x]);   // 1. 先修正所有祖先节点(父->根)s[x] = s[x] + s[pre[x]];    // 2. 修正自己return pre[x] = find(pre[x]);  // 原本的find
}

可以发现,不过是比原本的路径压缩 f i n d find find 多了两条语句罢了!如果我们把最后一句return pre[x] = find(pre[x]); 再优化一下,那就是下面的形式,不过该优化对时间效率的提升很小,因为在我们执行 find(pre[x]) 之后, p r e [ x ] pre[x] pre[x] 便已经直接指向根节点 r o o t root root,这样当我们下次再执行 f i n d ( p r e [ x ] ) find(pre[x]) find(pre[x]) 时,由于已经路径压缩过了,实际查找速度是 O ( 1 ) O(1) O(1) 的。

int find(int x)
{if(pre[x] == x) return x;int root = find(pre[x]);   // 1. 先修正所有祖先节点(父->根)s[x] = s[x] + s[pre[x]];    // 2. 修正自己return pre[x] = root;
}

img

代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 30010;int pre[N];
int d[N], s[N];
// s[i] 表示 i 所在集合中点的个数
// d[i] 标识 i 到其集合中根节点的距离(带有懒标记的权值数组int find(int x)
{// 当 pre[x] == x,即该节点就是集合的根节点时// 不存在岁回溯路径,也就不需要也不能去除懒标记if(pre[x] == x) return x;// 存在回溯路径,去除懒标记// 先递归,一直找到根节点int root = find(pre[x]);    // 从根节点开始往下回溯d[x] += d[pre[x]];  // d[x]_new = d[x]_old + d[pre[x]];,参考上面的图 return pre[x] = root;   // 别忘了路径压缩
}void merge(int a, int b)
{int fa = find(a), fb = find(b);if(fa == fb)    return ;// 可以合并// 只修改a的根节点fapre[fa] = fb;d[fa] += s[fb];// 修改集合大小s[fb] += s[fa];
}int main()
{for(int i = 0; i < N; i ++ ){pre[i] = i;s[i] = 1;d[i] = 0;   // 初始状态时,自己就是自己的根节点}int T;  cin >> T;while(T -- ){string op;  int a, b;cin >> op >> a >> b;if(op == "M")   merge(a, b);else    {int fa = find(a), fb = find(b);if(fa != fb)    cout << -1 << endl;// 注意a和b可能相等的情况else    cout << max(0, abs(d[a] - d[b]) - 1) << endl;}}return 0;
}

2024/3/11

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 30010;int pre[N], d[N], cnt[N];int find(int x)
{if(pre[x] == x) return x;int root = find(pre[x]);d[x] = d[x] + d[pre[x]];return pre[x] = root;
}int main()
{for(int i = 0; i < N; i ++ )    pre[i] = i, cnt[i] = 1;int q;  cin >> q;while(q -- ){string op;  int a, b;cin >> op >> a >> b;int fa = find(a), fb = find(b);if(op == "M"){if(fa != fb){pre[fa] = fb;d[fa] += cnt[fb];cnt[fb] += cnt[fa];}}else {if(fa != fb)    cout << -1 << endl;else {if(a == b)  cout << 0 << endl;else cout << abs(d[a] - d[b]) - 1 << endl;}}}return 0;
}

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

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

相关文章

本地部署Stable Diffusion生成爆火的AI图片

直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

边缘计算 vs. 云计算,谁才是工业物联网的未来?

前言 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理&#xff0c;但随着设备数量的激增&#xff0c;这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…

dell 台式机 电脑 纽扣电池 如何取下?

dell 台式机 电脑 纽扣电池 如何取下&#xff1f; 戴尔-optiplex-3060-塔式机-服务手册

NFC 智能门锁全栈解决方案:移动端、服务器、Web 管理平台

目录 一、系统整体架构 二、移动端 APP 开发 2.1 开发环境与基础准备 2.2 主要功能模块 2.3 示例代码&#xff08;Android/Kotlin 简化示例&#xff09; 三、后台服务开发 3.1 环境准备 3.2 主要功能 3.3 示例代码&#xff08;Node.js Express 简化示例&#xff09; …

【AI】MAC版本本地Stable Diffusion web ui安装

文章目录 前言环境依赖homebrewpython3下载stable-diffusion-webui webui模型准备模型网站 中文页面设置提示词转汉语转英文controlnet安装controlnet模型下载 结尾 前言 目前&#xff0c;市面上已经出现了很多用Ai 绘图制作的作品&#xff0c;用于自媒体或者商业等。例如表情…

Linux 云服务器开放端口

首先找到你买服务器的官网&#xff0c;我这里是阿里云 点击这里的控制台 这里先点手动添加&#xff0c;再看自己是UDP还是TCP协议&#xff0c;找到对应的协议&#xff0c;目的就填你想开放的端口&#xff0c;源填所有IP/4 0.0.0.0 添加备注点击保存就开放好了。

[unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用

当我打开一个二级弹窗后&#xff0c;希望可以通过点击弹窗以外的区域来关闭该弹窗。一开始我是在弹窗主节点上挂载了一个 button 组件&#xff0c;该 button 注册的点击事件中关闭该弹窗。在子节点&#xff08;一个背景图&#xff09;的image组件上启用 Raycast Target 选项&am…

表的约束及代码练习

一.表的约束 查看表&#xff1a;mysql> select * from t_hero; 1.设置t_hero的主键为t_id alter table t_hero add primary key(t_id); 2.设置t_hero t_id属性非空 alter table t_hero modify t_id int not null;3.设置name属性为非空非重复 alter table t_hero modify…

Linux笔记---动静态库(使用篇)

目录 1. 库的概念 2. 静态库&#xff08;Static Libraries&#xff09; 2.1 静态库的制作 2.2 静态库的使用 2.2.1 显式指定库文件及头文件路径 2.2.2 将库文件安装到系统目录 2.2.3 将头文件安装到系统目录 3. 动态库 3.1 动态库的制作 3.2 动态库的使用 3.2.1 显式…

Java并发编程2(锁-Sychronized)

目录 认识Java对象头 sychronized锁原理 基本概念 工作原理 1.作用在方法上 2.作用在代码块上 工作机制 JVM优化锁 Monitor锁 wait/notify park/unpark 线程状态转换案例 死锁 概念 死锁发生的必要条件 哲学家问题 活锁 饥饿 概念 饥饿的原因 Reentrant…

现阶段高校的人工智能方案培训如何?

人工智能在未来肯定是核心发展力&#xff0c;核心竞争力&#xff0c;也是国家重点扶持的对象&#xff0c;但我还是不看好高校的人工智能方向&#xff0c;只是怕有些同学对市场前景盲目乐观&#xff0c;就轻易上车了。 你要是985以上的高校&#xff0c;可以考虑选择人工智能&…

JavaScript中的继承有哪些方式?各有什么优缺点

在 JavaScript 中&#xff0c;继承主要通过原型链实现&#xff0c;常见的继承方式有以下几种&#xff0c;每种方式都有其优缺点&#xff1a; 1. 原型链继承 1. 实现方式&#xff1a;将子类的原型对象指向父类的实例。 function Parent() {} function Child() {} Child.protot…

深入理解指针(3)(C语言版)

文章目录 前言 一、字符指针变量二、数组指针变量2.1 数组指针变量是什么2.2 数组指针变量怎么初始化2.2.1 静态初始化2.2.2 动态初始化 三、二维数组传参的本质四、函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字4.4拓展 五、函数指针数组六、转…

csp信奥赛C++常用的数学函数详解

csp信奥赛C常用的数学函数详解 在信息学奥林匹克竞赛&#xff08;信奥赛&#xff09;中&#xff0c;C 的 <cmath> 头文件提供了丰富的数学函数&#xff0c;用于高效处理数学运算。以下是常用系统数学函数的详细讲解及汇总表格。 绝对值函数 int abs(int x)&#xff1a;返…

ChatDBA VS DeepSeek:快速诊断 OceanBase 集群新租户数据同步异常

社区王牌专栏《一问一实验&#xff1a;AI 版》改版以来已发布多期&#xff08;51-60&#xff09;&#xff0c;展现了 ChatDBA 在多种场景下解决问题的效果。 下面让我们正式进入《一问一实验&#xff1a;AI 版》第 62 期&#xff0c;看看 ChatDBA 最新效果以及与热门大模型 De…

oracle数据库(数据库启动关闭/sqlplus登录及基本操作/设置字符集/distinct去重)

目录 1. Oracle数据库启动 2. Oracle数据库关闭 3. sqlplus登录Oracle数据库 3.1 使用sqlplus登录Oracle数据库 3.2 使用sqlplus登录Oracle数据库 3.3 远程登录 3.4 解锁用户 3.5 修改用户密码 3.6 查看当前语言环境 4. sqlplus基本操作 4.1 显示当前用户 4.2 查看当前用户…

Java 大视界 -- Java 大数据在智能金融区块链跨境支付与结算中的应用(154)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

在Cesium中使用ThreeJs材质(不是场景融合哦)

在Cesium中使用ThreeJs材质(不是场景融合哦&#xff09;_哔哩哔哩_bilibili

给Web开发者的HarmonyOS指南02-布局样式

给Web开发者的HarmonyOS指南02-布局样式 本系列教程适合鸿蒙 HarmonyOS 初学者&#xff0c;为那些熟悉用 HTML 与 CSS 语法的 Web 前端开发者准备的。 本系列教程会将 HTML/CSS 代码片段替换为等价的 HarmonyOS/ArkUI 代码。 布局基础对比 在Web开发中&#xff0c;我们使用CS…

京东软件测试岗位经典面试题(附答案)

1、黑盒测试的测试用例常见设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 1&#xff09;等价类划分&#xff1a;等价类是指某个输入域的子集合.在该子集合中&#xff0c;各个输入数据对于揭露程序中的错误都是等效的.并合理地假…