并查集 c++函数的值传递和引用传递 晴神问

article/2025/8/28 16:54:42

目录

学校的班级个数

手推7个班级,答案17?怀疑人生

破案了,应该是6个班。

破案了,原来写的是 unionxy(a, b, father);

c++ if两个数同时为正或为负 简洁写法

可以用位运算?

c++可以这样赋值吗?a=b=2

典型数组越界报错:Line 1122: Char 34: runtime error: addition of unsigned offset to 0x502000000190 overflowed to 0x50200000018c (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_vector.h:1131:34class Solution { public: int search(vector & nums, int target) { int n=nums.size(); int left=-1,right=n-1,x=nums[n-1]; int mid = left+(right-left)/2;int m = nums[mid]; while(left+1 x&&x>=m) right=mid-1;else left=mid;} } return (right =0&&nums[right]==target)?right:-1; } };

修改说明:

解释:

warning: ^ has lower precedence than <; < will be evaluated first [-Wparentheses] 22 | if((p->val-root->val)^(q->val-root->val)<0) | ^~~~~~~~~~~~~~~~~~~~~怎么办

解释:

c++函数传入Vector《int》 在函数里面修改vector可以吗

1. 按值传递(修改不会影响原始向量)

2. 按引用传递(修改会影响原始向量)

3. 按常量引用传递(如果不需要修改向量)

三目


题目

学校的班级个数

通过数

1696

提交数

3677

难度

中等

显示标签


题目描述

现有一个学校,学校中有若干个班级,每个班级中有若干个学生,每个学生只会存在于一个班级中。如果学生A和学生B处于一个班级,学生B和学生C处于一个班级,那么我们称学生A和学生C也处于一个班级。

现已知学校中共n​个学生(编号为从1n),并给出m​组学生关系(指定两个学生处于一个班级),问总共有多少个班级。

输入描述

第一行两个整数n​​、m​​(1≤n≤100,1≤m≤100​​),分别表示学生个数、学生关系个数;

接下来m​行,每行两个整数a​和b​(1≤a≤n,1≤b≤n​, a≠b),表示编号为a的学生和编号为b的学生处于一个班级。

输出描述

输出一个整数,表示班级个数。

样例1

输入

复制

 

5 3 4 2 1 3 2 5

输出

复制

 

2

解释

编号245的学生在同一个班级,编号13的学生在同一个班级,因此共有两个班级。

手推7个班级,答案17?怀疑人生

不服来战?

57 46 22 20 20 46 9 22

41 3030 4 42 48 30 5 41 6 29 5050 4 5 1 49 5 41 48 24 56 23 56 21 8 3 9 24 21 12 21 11 49

31 40 10 31 51 13 10 13

45 52

37 2 15 3737 33 26 27 33 26 55 15 55 2727 38 43 5454 2 54 26 54 36

14 19

44 32

破案了,应该是6个班。

答案17是把没出现的人一人一班。。。

1

57:1

57:3

57:4

57:5

57:6

57:8

57:9

57:11

57:12

57:20

57:21

57:22

57:23

57:24

57:29

57:30

57:41

57:42

57:46

57:48

57:49

57:50

57:56

57:57

7:7

2

13:51

13:10

13:13

13:31

13:40

16:16

17:17

18:18

3

19:19

19:14

25:25

28:28

34:34

4

32:32

32:44

35:35

5

38:26

38:2

38:15

38:27

38:33

38:36

38:37

38:38

38:43

38:54

38:55

39:39

47:47

6

52:45

52:52

53:53

破案了,原来写的是 unionxy(a, b, father);

因为他编号从1开始,你不减一会数组越界 unionxy(a-1, b-1, father);

-1立马完美通过

#include<stdio.h>
#include<bits/stdc++.h>
#include<vector>
using namespace std;vector<int> init(int n)
{vector<int> father(n,1);//父亲都初始化为自己for(int i=0;i<n;i++)father[i]=i;return father;
}
int findFather(int a,vector<int>& father)
{int x=a;//记录该节点while(a!=father[a])a=father[a];int f=father[a];//记录根节点a=x;while(a!=father[a]){int temp = father[a];father[a] = f;a = temp;}//压缩路径return f;
}
void unionxy(int a,int b,vector<int>& father)
{//while(a!=father[a])a=father[a];father[findFather(a,father)]=findFather(b,father);findFather(a,father);
}
int main()
{int n,m,a,b,num=0;//cout<<n<<m;scanf("%d %d",&n,&m);
vector<int> father=init(n);for (int j=0;j<m;j++){scanf("%d %d",&a,&b);unionxy(a-1,b-1,father);}for(int i=0;i<n;i++)if(father[i]==i)num++;printf("%d",num);}

c++ if两个数同时为正或为负 简洁写法

ChatGLM

在C++中,要判断两个数同时为正或同时为负,可以使用逻辑运算符来实现简洁的写法。假设有两个整数变量 a 和 b,可以使用以下代码:

cpp

复制

if ((a > 0 && b > 0) || (a < 0 && b < 0)) {// 两个数同时为正或同时为负
}

这段代码的逻辑是:

  • (a > 0 && b > 0) 检查 a 和 b 是否同时为正。
  • (a < 0 && b < 0) 检查 a 和 b 是否同时为负。
  • || 运算符表示“或”,即只要满足其中一个条件,整个条件就为真。

这样就可以简洁地判断两个数是否同时为正或同时为负。

访客_c53a24

可以用位运算?

ChatGLM

是的,可以使用位运算来简洁地判断两个数是否同时为正或同时为负。这种方法利用了符号位的概念。在大多数计算机系统中,整数的符号位是最高位,正数的符号位为0,负数的符号位为1。

假设有两个整数变量 a 和 b,可以使用以下代码:

c

复制

if (((a ^ b) >= 0)) {// 两个数同时为正或同时为负
}

解释:

  • a ^ b 是按位异或操作。如果 a 和 b 的符号位相同(即同时为正或同时为负),那么 a ^ b 的符号位将为0,整个结果将是一个非负数。
  • 因此,((a ^ b) >= 0) 将在 a 和 b 同时为正或同时为负时为真。

这种方法利用了位运算的特性,避免了显式的条件判断,从而更加简洁高效。

访客_c53a24

c++可以这样赋值吗?a=b=2

ChatGLM

在C++中,你可以使用链式赋值,即连续给多个变量赋相同的值。所以,a = b = 2 是合法的,并且会将 2 赋值给 b,然后再将 b 的值赋给 a

例如:

cpp
int a, b;
a = b = 2;
std::cout << a << " " << b << std::endl; // 输出: 2 2

这行代码的执行顺序如下:

  1. b = 2:将 2 赋值给 b
  2. a = b:将 b 的值(现在是 2)赋值给 a

因此,a 和 b 最终都会被赋值为 2

访客_c53a24

典型数组越界报错:Line 1122: Char 34: runtime error: addition of unsigned offset to 0x502000000190 overflowed to 0x50200000018c (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_vector.h:1131:34class Solution { public: int search(vector<int>& nums, int target) { int n=nums.size(); int left=-1,right=n-1,x=nums[n-1]; int mid = left+(right-left)/2;int m = nums[mid]; while(left+1<right) { mid = left+(right-left)/2; m = nums[mid]; if(target<=m) { if(target==m){right=mid;break;} if(target<=x&&x<m) left= mid-1;else right=mid; }else {if(target>x&&x>=m) right=mid-1;else left=mid;} } return (right<n&&right>=0&&nums[right]==target)?right:-1; } };


你遇到的错误与向量(数组)索引计算时的溢出有关。这通常发生在当你尝试用一个超出有效范围的索引去访问向量中的元素,或者在进行索引相关的算术运算时发生了溢出。

在你的代码里,问题可能出在 mid(中间索引)的计算上,或者 left(左边界)和 right(右边界)这两个索引的维护上。我们来检查一下代码,并进行修改,以确保索引始终在有效的范围内。

下面是修改后的代码版本,包含了一些改进,可以更好地处理索引问题:

cpp

复制

#include <vector>
using namespace std;class Solution {
public:int search(vector<int>& nums, int target) {int n = nums.size();if (n == 0) return -1; // 如果数组为空,直接返回-1int left = 0, right = n - 1; // 初始化左边界为0,右边界为最后一个元素的索引int x = nums[n - 1]; // 获取最后一个元素的值(虽然在这个修正版本里暂时用不到,但保留)while (left <= right) { // 循环条件:只要左边界不越过右边界就继续int mid = left + (right - left) / 2; // 计算中间索引,这样写可以避免整数溢出int m = nums[mid]; // 获取中间位置的元素值if (m == target) {return mid; // 如果中间元素正好是目标值,直接返回它的索引} else if (m < target) {left = mid + 1; // 如果中间元素小于目标值,说明目标在右半部分,调整左边界} else {right = mid - 1; // 如果中间元素大于目标值,说明目标在左半部分,调整右边界}}return -1; // 如果循环结束都没找到,返回-1表示目标不在数组中}
};

修改说明:

  1. 初始检查:增加了一个检查,如果传入的向量是空的(大小为0),直接返回-1,避免后续操作出错。
  2. 初始化:将 left 初始化为0,right 初始化为 n - 1(数组的最后一个有效索引),确保它们一开始就在合法的范围内。
  3. 循环条件:将循环条件改为 left <= right。这意味着只要 left 不大于 right,循环就会继续。当 left 最终等于 right + 1 时,循环结束,表明已经搜索了所有可能的位置。
  4. Mid 计算:计算 mid 的方式改为 left + (right - left) / 2。这种写法比 (left + right) / 2 更安全,因为它先计算 right - left,这个差值通常比 left + right 小得多,不容易溢出,尤其是在 left 和 right 都很大的时候。
  5. 比较逻辑:简化了比较逻辑。直接检查 mid 位置的元素 m 是否等于 target。如果不等于,根据 m 与 target 的大小关系,将搜索范围缩小到左半部分或右半部分。

这个修改后的代码版本应该能正确处理索引,避免你之前遇到的溢出问题。如果你的问题依然存在,请提供更多的上下文信息或者具体的错误信息,我会尽力提供进一步的帮助。

访客_c53a24

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { auto dfs=[&](this auto&& dfs,TreeNode* root)-> TreeNode* { if(root==q||root==q||root==NULL)return root; TreeNode* l = dfs(root->left); TreeNode* r = dfs(root->right); if(l!=NULL&&r!=NULL)return root;else return (l!=NULL)? l: r; }; return dfs(root); } };哪里有错

ChatGLM

你的代码有几个小错误和可以改进的地方:

  1. 在 if(root==q||root==q||root==NULL) 这一行中,root==q 出现了两次,应该是 root==p 和 root==q

  2. 在 if(l!=NULL&&r!=NULL)return root;else return (l!=NULL)? l: r; 这一行中,逻辑可以简化,因为如果 l 和 r 都不为 NULL,那么 root 就是最低公共祖先。否则,返回 l 或 r 中不为 NULL 的那个。

以下是修正后的代码:

cpp

复制

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {auto dfs = [&](this auto&& dfs, TreeNode* root) -> TreeNode* {if (root == nullptr) return nullptr;if (root == p || root == q) return root;TreeNode* left = dfs(root->left);TreeNode* right = dfs(root->right);if (left != nullptr && right != nullptr) return root;return left != nullptr ? left : right;};return dfs(root);}
};

解释:

  1. 初始检查:如果 root 是 nullptr,直接返回 nullptr
  2. 找到目标节点:如果 root 是 p 或 q,返回 root
  3. 递归搜索:递归搜索左子树和右子树。
  4. 确定最低公共祖先
    • 如果左子树和右子树都找到了目标节点,那么当前节点就是最低公共祖先。
    • 否则,返回左子树或右子树中找到的目标节点。

这样修改后,代码逻辑更加清晰,并且能够正确找到最低公共祖先。

访客_c53a24

 if((p->val-root->val)^(q->val-root->val)<0)

warning: ^ has lower precedence than <; < will be evaluated first [-Wparentheses] 22 | if((p->val-root->val)^(q->val-root->val)<0) | ^~~~~~~~~~~~~~~~~~~~~怎么办

ChatGLM

这个警告是因为 ^(按位异或)运算符的优先级低于 <(小于)运算符。为了避免这种歧义,应该使用括号明确表达式的优先级。

在你的代码中,(p->val - root->val) ^ (q->val - root->val) < 0 这一行,应该明确 (p->val - root->val) 和 (q->val - root->val) 的异或操作优先于 < 操作。

以下是修正后的代码:

cpp
if (((p->val - root->val) ^ (q->val - root->val)) < 0)
// 你的代码逻辑

;

解释:

  1. 使用额外的括号 ((p->val - root->val) ^ (q->val - root->val)) 来确保异或操作优先于比较操作。
  2. 这样可以避免优先级问题,并且代码更加清晰。

这样修改后,编译器就不会再发出警告,并且代码的逻辑也更加明确。

访客_c53a24

c++函数传入Vector《int》 在函数里面修改vector可以吗

ChatGLM

是的,在C++中,你可以将一个 std::vector<int> 传递给函数,并在函数内部修改它。默认情况下,如果你直接传递 std::vector<int>,它是按值传递的,这意味着函数内部会创建一个该向量的副本,对副本的修改不会影响原始向量。

如果你想在函数内部修改原始向量,你可以使用引用传递。以下是两种方法:

1. 按值传递(修改不会影响原始向量)

cpp

复制

#include <vector>
#include <iostream>void modifyVector(std::vector<int> vec) {vec.push_back(4); // 修改的是副本
}int main() {std::vector<int> myVector = {1, 2, 3};modifyVector(myVector);// myVector 仍然是 {1, 2, 3}for (int num : myVector) {std::cout << num << " ";}return 0;
}

2. 按引用传递(修改会影响原始向量)

cpp

复制

#include <vector>
#include <iostream>void modifyVector(std::vector<int>& vec) {vec.push_back(4); // 修改的是原始向量
}int main() {std::vector<int> myVector = {1, 2, 3};modifyVector(myVector);// myVector 现在是 {1, 2, 3, 4}for (int num : myVector) {std::cout << num << " ";}return 0;
}

3. 按常量引用传递(如果不需要修改向量)

如果你只是想在函数内部读取向量,而不需要修改它,可以使用常量引用传递:

cpp

复制

#include <vector>
#include <iostream>void printVector(const std::vector<int>& vec) {for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;
}int main() {std::vector<int> myVector = {1, 2, 3};printVector(myVector);// myVector 仍然是 {1, 2, 3}return 0;
}

引用

总结:

  • 按值传递:函数内部修改的是副本,不影响原始向量。
  • 按引用传递:函数内部修改的是原始向量。
  • 按常量引用传递:函数内部只能读取向量,不能修改。

根据你的需求选择合适的方式传递向量。

三目

偶会报错

cout << (findFather(k, father) == findFather(j, father)) ? "Yes" : "No" << endl;

解决方法是加个括号 

cout << ((findFather(k, father) == findFather(j, father)) ? "Yes" : "No" )<< endl;

http://www.hkcw.cn/article/dliETUQPdN.shtml

相关文章

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客户都陆续升级到 Dynamics 365 Business Central 26 wave, Microsoft 提供一个基于Copilot 的Sales Order Agent&#xff0c;此文将此功能做个介绍. Explorer: 可以看到26版本上面增加了这样一个新图标。 Configuration: 配置过程…

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 &#xff08;1&#xff09;查询成功 &#xff08;2&#xff09;查询失败 &#xff08;3&#xff09;SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 &#xff08;1&#xff09;盲注分析 &#xff08;2&#xf…

NodeJS 基于 Koa, 开发一个读取文件,并返回给客户端文件下载,以及读取文件形成列表和文件删除的代码演示

前言 在上一篇文章 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 中&#xff0c;我们演示了如何将用户的 Mysql 数据库进行备份的代码。但是&#xff0c;这个备份&#xff0c;只是备份在了服务器上了。 而我们用户的真实需求&#xff0c;是需要将备份文件下载到本地进行…

中国自然灾害影响及损失数据

自然灾害往往会导致大量的人员伤亡和财产损失&#xff0c;数据集详细记载了2014-2020年中国自然灾害影响以及灾害造成的损失情况。其中包括地震、台风、雨雪、阵雨、雪灾、暴雨、旱灾、龙卷风、泥石流、山崩、泥石流、滑坡、洪涝等灾害事件。 数据集主要以excel的格式存储。属性…

UE5.5 pixelstreaming插件打包报错

文章目录 错误内容如下解决方案推流服务器不能使用 错误内容如下 The following files are set to be staged, but contain restricted folder names ("Linux"): CTZ5_5/Samples/PixelStreaming/WebServers/Extras/FrontendTests/dockerfiles/linux/Dockerfile CTZ5…

UE5打包项目设置Project Settings(打包widows exe安装包)

UE5打包项目Project Settings Edit-Project Settings- Packaging-Ini Section Denylist-Advanced 1&#xff1a;打包 2&#xff1a;高级设置 3&#xff1a;勾选创建压缩包 4&#xff1a;添加要打包地图Map的数量 5&#xff1a;选择要打包的地图Maps 6&#xff1a;Project-Bui…

全志F1c200开发笔记——移植Debian文件系统

1.搭建环境 sudo apt install qemu-user-static -y sudo apt install debootstrap -y mkdir rootfs 2.拉取文件系统 这边我参照墨云大神的文档&#xff0c;但是华为镜像已经没有armel了&#xff0c;我找到了官方仓库&#xff0c;还是有的&#xff0c;拉取速度比较慢 sudo d…

多模态大语言模型arxiv论文略读(九十九)

PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文标题&#xff1a;PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文作者&#xff1a;Junyi Li, Junfeng Wu, Weizhi Zhao, Song Bai, Xiang Bai ➡️ 研究机构…

SpringCloud基础知识

学习视频链接:SpringCloud | 黑马程序员 文章目录 NacosDocker部署1.拉取镜像2.运行nacos3.测试 Nacos介绍核心功能&#xff1a;基本概念&#xff1a;部署模式&#xff1a;1.单机模式&#xff08;Standalone&#xff09;2.集群模式&#xff08;Cluster&#xff09;3.云原生部署…

12-后端Web实战(登录认证)

在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。最终要实现的效果是&#…

CppCon 2014 学习第4天:Transactional Language Constructs for C++ TS(未进入到标准)

事务性编程 “Transactional Language Constructs for C TS”指的是在C技术规范&#xff08;Technical Specification, TS&#xff09;中提出的一套用于支持**事务性编程&#xff08;Transactional Programming&#xff09;**的语言构造。 什么是事务性编程&#xff1f; 事务…

【论文阅读】《PEACE: Empowering Geologic Map Holistic Understanding with MLLMs》

目录 前言一、研究背景与问题1-1、地质图的重要性1-2、现有MLLMs的不足 二、 主要贡献2-1、GeoMap-Bench&#xff1a;首个地质图理解评估基准2-2、GeoMap-Agent&#xff1a;首个地质图专用AI代理2-3、实验验证与性能优势 三、关键技术3-1、 数据构建与预处理3-2、分层信息提取&…

React 编译器 RC

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

简单三步FastAdmin 开源框架的安装

简单三步FastAdmin 开源框架的安装 第一步&#xff1a;新建站点1&#xff0c;在宝塔面板中&#xff0c;创建一个新的站点&#xff0c;并填写项目域名。 第二步&#xff1a;上传框架1&#xff0c;框架下载2&#xff0c;上传解压缩 第三步&#xff1a;配置并安装1&#xff0c;进入…

Chuanpai、Nihongo wa Muzukashii Desu、K-skip Permutation

一、Chuanpai 题目描述 川牌是四川传统纸牌&#xff0c;每张牌标记两个整数 x 和 y&#xff08;1≤x≤y≤6&#xff09;。给定整数 k&#xff0c;要求统计满足 xyk 的不同牌型数量。两张牌类型不同当且仅当 (x1​,y1​) 和 (x2​,y2​) 不同&#xff08;即 x1​x2​ 或 y1​y…

【第4章 图像与视频】4.5 操作图像的像素

文章目录 前言示例-获取和修改图像数据图像数据的遍历方式图像滤镜负片滤镜黑白滤镜浮雕滤镜filter滤镜属性 前言 getImageData() 与 putImageData() 这两个方法分别用来获取图像的像素信息&#xff0c;以及向图像中插入像素。与此同时&#xff0c;如果有需要&#xff0c;也可…

【Linux系统】进程概念(进程状态、进程优先级、进程切换 和 进程调度)

文章目录 一、基本概念与基本操作1.进程的概念&#xff08;描述进程-PCB&#xff09;2.task_ struct 里的内容3.查看进程标示符的方法&#xff08;getpid函数&#xff0c;系统调用&#xff09;4.查看进程的方法4.1 进程的信息可以通过 /proc 系统文件夹查看&#xff08;不推荐&…

单片机(新坑)

20250521 开始学习单片机的基础知识 参考视频链接 必备软件 Keil5 用于编写C51代码 STC-ISP 基础知识 单片机&#xff0c;Micro Controller Unit&#xff0c;简称MCU&#xff0c;其内部继承了CPU、RAM、ROM、定时器、中断系统、通讯接口等常见硬件功能。单片机的任务是信…

Nordic nRF52832使用寄存器实现SPI功能

目录 概述 1 SPI相关的寄存器 1.1 SPI的框架结构 1.2 功能描述 1.3 SPI Master模式引脚配置 1.4 SPI Master模式下的时序 2 SPI相关的寄存器 2.1 Instances 2.2 详细寄存器定义 2.3 SPI master interface特性 3 Zephyr 平台下SPI功能时序&#xff08;寄存器&#xf…

25平航杯复现

44:一&#xff0c;题目背景 爱而不得&#xff0c;进而由爱生恨。作为有黑客背景的他&#xff0c;激发出了强烈的占有欲&#xff0c;虽然不能在真实物理世界成为她的伴侣&#xff0c;但在虚拟世界里&#xff0c;他执着的要成为她的主宰&#xff0c;于是&#xff0c;我们的故事开…