当前位置: 首页 > news >正文

带权并查集注意事项

食物链

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int p[N],d[N];
int find(int x)
{if(p[x]!=x){int root=find(p[x]);d[x]+=d[p[x]];p[x]=root;}return p[x];
}
int main()
{int n,k;cin>>n>>k;for(int i=1;i<=n;i++)p[i]=i;int ans=0;while(k--){int op,a,b;cin>>op>>a>>b;int pa=find(a),pb=find(b);if(a>n||b>n){ans++;continue;}if(op==1){// if(pa==pb&&((d[a]-d[b])%3+3)%3!=0)ans++;if(pa==pb&&abs(d[a]-d[b])%3!=0)ans++;if(pa!=pb){p[pa]=pb;d[pa]=d[b]-d[a];}}else {// if(pa==pb&&((d[a]-d[b])%3+3)%3!=1)ans++;if(pa==pb&&abs(d[a]-d[b])%3!=1)ans++;if(pa!=pb){p[pa]=pb;d[pa]=d[b]-d[a]+1;}}}cout<<ans<<endl;return 0;
}

让我们再次分析这两个表达式:`(d[a]-d[b])%3+3)%3!=1` 和 `abs(d[a]-d[b])%3!=1`。

首先,我们来看 `(d[a]-d[b])%3+3)%3!=1` 这个表达式。这个表达式的目的是在 `d[a]` 和 `d[b]` 的差值模3的基础上加3,然后再对3取模,以确保结果是非负的。这样做的原因是,当 `d[a]-d[b]` 为负数时,直接对3取模可能会得到一个负数,而加上3可以确保结果在0到2的范围内。但是,由于模运算 `%` 本身就会返回一个非负的余数,所以实际上这个操作是多余的。

现在,我们来看 `abs(d[a]-d[b])%3!=1` 这个表达式。这个表达式首先计算 `d[a]` 和 `d[b]` 的绝对差值,然后对3取模。如果 `d[a]` 和 `d[b]` 的差值是负数,那么 `abs` 函数会将其变为正数,然后对3取模。

关键的区别在于,`(d[a]-d[b])%3+3)%3!=1` 这个表达式在 `d[a]-d[b]` 为负数时,会得到一个与 `d[a]-d[b]` 模3相同的结果,而 `abs(d[a]-d[b])%3!=1` 这个表达式会得到 `d[a]-d[b]` 的绝对值模3的结果。

例如,如果 `d[a]-d[b] = -1`,那么:
- `(d[a]-d[b])%3+3)%3 = (-1)%3+3)%3 = 2%3 = 2`
- `abs(d[a]-d[b])%3 = abs(-1)%3 = 1%3 = 1`

在这种情况下,`(d[a]-d[b])%3+3)%3!=1` 会检查 `2!=1`,这是正确的。但是,`abs(d[a]-d[b])%3!=1` 会检查 `1!=1`,这是错误的。

因此,`(d[a]-d[b])%3+3)%3!=1` 不能写成 `abs(d[a]-d[b])%3!=1`,因为它们在处理负数时的行为是不同的。
 

http://www.lryc.cn/news/467097.html

相关文章:

  • No.18 笔记 | XXE(XML 外部实体注入)漏洞原理、分类、利用及防御整理
  • Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍
  • 【毕业设计】基于SpringBoot的网上商城系统
  • 【GIT】.gitignore文件的使用
  • 【Qt】控件——Qt多元素控件、常见的多元素控件、多元素控件的使用、List Widget、Table Widget、Tree Widget
  • 【图论】(五)最短路径算法(D / BF / SPFA / F / A*)
  • Scala中的reduce
  • 调查显示软件供应链攻击增加
  • JMeter使用不同方式传递接口参数
  • 《C++开发 AR 游戏:开启未来娱乐新潮流》
  • 列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换
  • 美图设计室
  • 张雪峰:如果你现在是计算机专业,一定要优先报网络安全,它是未来国家发展的大方向
  • Golang | Leetcode Golang题解之第486题预测赢家
  • 【Golang】Go语言中如何创建Cron定时任务
  • Android compose 重建流程1
  • C++:模板(2)
  • Golang 并发编程:Context 包的使用与并发控制
  • QGraphics类型学习使用【Qt】【C++】
  • 迁移学习和在线学习小结
  • 克里金插值(Kriging interpolation)
  • sealed class-kotlin中的封闭类
  • MongoDB Shell 基本命令(一)
  • Flink时间语义和时间窗口
  • 在wpf中登录成功之后怎么设置主页布局及点击不同的菜单跳转到不同的页面,这个是我们做wpf项目必要会的一个功能
  • 基于opencv的人脸闭眼识别疲劳监测
  • aeo认证需要什么材料
  • 【iOS】YYModel
  • Cadence元件A属性和B属性相互覆盖
  • 【火山引擎】语音合成 | HTTP接口 | 一次性合成 | python