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

算法题(187):程序自动分析

审题:

本题需要我们判断是否可以同时满足题目给定的若干等式或不等式,判断出后根据结果输出YES或NO

思路:
方法一:离散化+并查集

使用并查集:其实题目中只存在两者相等或不等两种情况,而等于具有传递性,相等就可以放入同一个集合中用树结构存储,判断不等是否成立就可以看两者是否处于同一集合中,若在同一集合说明两者是相等的,此时不等一定不成立,直接返回false。所有情况都通过就返回true

数据范围图示:

注意:我们看到数据值的范围是可以到达1e9的,但是我们的fa数组无法开辟那么多空间,而数据个数只有1e5的规模,所以我们可以通过离散化数据值来存储进入fa数组,从而避免fa数组空间不足的情况出现

解题:

#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N = 1e5 + 10;
int t,n;
//成组记录,可以保留所有操作指令
struct node
{int i, j, e;
}a[N];
//离散化
int pos;
int disc[N * 2];
unordered_map<int, int> m;
//并查集
int fa[N * 2];
int find(int b)
{return fa[b] == b ? b : fa[b] = find(fa[b]);
}
void un(int b, int c)
{fa[find(b)] = find(c);
}
bool judge(int b, int c)
{return find(b) == find(c);
}
//解决函数
bool solve()
{//清空痕迹pos = 0;m.clear();//离散化操作cin >> n;for (int i = 1; i <= n; i++){cin >> a[i].i >> a[i].j >> a[i].e;disc[++pos] = a[i].i;disc[++pos] = a[i].j;}sort(disc + 1, disc + 1 + pos);//升序排序int num = 0;for (int i = 1; i <= pos; i++){if (m.count(disc[i])) continue;//去重num++;m[disc[i]] = num;}//并查集操作//初始化for (int i = 1; i <= pos; i++){fa[i] = i;}for (int i = 1; i <= n; i++){if (a[i].e == 1)//合并{un(m[a[i].i], m[a[i].j]);}}for (int i = 1; i <= n; i++){//检查判断if (a[i].e == 0 && judge(m[a[i].i], m[a[i].j])){return false;}}return true;
}
int main()
{cin >> t;while (t--){if (solve()) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

注意:

1、由于我们的等式不等式有多组,所以我们使用结构体数组记录数据,且这样记录还会将等式/不等式两边的对象和符号绑定起来,方便将数据离散化后可以直接知道哪些数之间有什么关系

2、由于需要判断多组,所以我们需要将前面的残留数据清除,disc直接用数据覆盖即可,pos变量和m哈希表需要手动清除数据,fa则每次都进行初始化无需特殊处理。

3.在进行等式和不等式的并查集处理的时候不能放在一起只扫描一次,因为题目中的等于和不等于不一定是连续的,也就是说等于和不等于是掺杂在一起的,若一轮处理会导致判误

举例

  x1 = x2

   x2 ≠ x3

     x2 = x3

如果我们按顺序合在一起扫描等式和不等式,那么在第二条地方不会返回false,因为x2和x3此时可以不等,且进入第三条我们也只是将集合合并,并未涉及判断,最后会返回true

但是实际上等式是不成立的,所以我们应该先扫描一次所有等式,然后再扫描所有不等式进行判断

错误代码:

P1955 [NOI2015] 程序自动分析 - 洛谷

http://www.xdnf.cn/news/18321.html

相关文章:

  • 告别服务器!Amazon Lambda无服务开发实战指南
  • 云原生俱乐部-k8s知识点归纳(6)
  • 多模态大模型研究每日简报【2025-08-21】
  • 【STM32入门教程】新建工程
  • 开源代码——gtsam_points配置安装
  • 机器学习经典算法总结:K-Means聚类与集成学习(Bagging, Boosting, Stacking)
  • 桌面挂件不能承受之重——GIF
  • 机器学习之数据预处理学习总结
  • MybatisPlusAutoConfiguration源码阅读
  • 强化学习算法分类与介绍(含权重更新公式)
  • 深度解析Atlassian 团队协作套件(Jira、Confluence、Loom、Rovo)如何赋能全球分布式团队协作
  • Windows查看端口占用情况
  • 2025年物流大数据分析的主要趋势
  • 【LeetCode 热题 100】322. 零钱兑换——(解法二)自底向上
  • 嵌入式接口通识知识之SDIO接口
  • 聚铭安全管家平台2.0实战解码 | 安服篇(四):重构威胁追溯体系
  • 手写MyBatis第28弹:告别代理,直击本质:手写MyBatis SqlSession的增删改查奥秘
  • 「数据获取」《中国环境统计年鉴》(1998-2024)(获取方式看绑定的资源)
  • C# 编写一个XmlToDota的转换工具
  • Seaborn数据可视化实战:Seaborn入门-环境搭建与基础操作
  • [ Servlet 服务器]
  • electron-vite_18Less和Sass共用样式指定
  • 基于混合注意力网络和深度信念网络的鲁棒视频水印技术基础理论深度解析
  • AI设计师-标小智旗下AI在线设计平台
  • [论文阅读] 人工智能 + 软件工程 | 当AI成为文学研究员:Agentic DraCor如何用MCP解锁戏剧数据分析
  • 设计模式之观察者模式
  • 为什么可以kvcache
  • 订单簿数据深度学习方法在大单发现应用
  • 微信小程序集成vant-weapp时,构建npm报错的解决办法
  • 深度学习-计算机视觉-物体检测与边缘框实现