《算法竞赛·快冲300题》每日一题:“x1 == x2”

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

x1 == x2” ,链接: http://oj.ecustacm.cn/problem.php?id=1725

题目描述

【题目描述】 现在给定一些变量的等于或者不等于的约束,请你判断这些约束能否同时满足。
   输入时变量为x1,x2,…,xn,均以x开始,x后面为该变量对应的编号。
   约束条件只有"=“或者”!="。
【输入格式】 输入第一行为正整数T,表示存在T组测试数据。(T≤10)
   每组测试数据第一行为正整数n,表示约束条件的数量。(n≤1000000)
   接下来n行,每行以下列形式输出
   xi = xj
   xi != xj
   其中i和j表示对应变量的编号。(1≤i,j≤10^9)
【输出格式】 对于每组测试数据,输出一行Yes表示可以满足,输出No表示不能满足。
【输入样例】

2
4
x1 = x7
x9 != x7
x13 = x9
x1 = x13
2
x1 = x2
x2 = x1

【输出样例】

No
Yes

题解

   本题的解法显然是并查集。首先建立并查集,把相等的约束合并。然后逐一检查不等的约束,如果有一个与并查集产生了矛盾,输出“No”;如果完全没有产生矛盾,输出“Yes”。
   但是,如果直接用x的编号建立并查集会超内存。因为编号最大为 1 0 9 10^9 109,直接建立并查集,需要 1 0 9 10^9 109 = 1G的空间。
   如何优化空间?由于最多只有n= 1 0 6 10^6 106个约束,x的编号数量最多只有 2 × 1 0 6 2×10^6 2×106个。这是典型的离散化,把x的原来 1 0 9 10^9 109个编号,转换为 2 × 1 0 6 2×10^6 2×106个新编号。
【重点】 离散化 。

C++代码

   离散化的编码(离散化见《算法竞赛》,清华大学出版社,罗勇军、郭卫斌著,75页,2.7 离散化),可以手工编码,也可以用STL的lower_bound()和unique()。下面的代码用STL实现。
  注意输入的处理。

#include<bits/stdc++.h>
using namespace std;
struct node{int x, y, z;}a[1000010];
int tot, b[2000010];
int s[2000010];         //并查集
int get_id(int x){      //返回离散化后的新值return lower_bound(b + 1, b + 1 + tot, x) - b;
}
int find_set(int x){if(x != s[x]) s[x] = find_set(s[x]);return s[x];
}
int main(){int T; cin >> T;while(T--)    {int n; cin >> n;tot = 0;for(int i = 1; i <= n; i++) {char ch1, ch2;  string str;cin >> ch1 >> a[i].x >> str >> ch2 >> a[i].y;if(str[0] == '=')  a[i].z = 1;  //相等else               a[i].z = 0;  //不等b[++tot] = a[i].x;              //把a的编号记录在b中b[++tot] = a[i].y;}sort(b + 1, b + 1 + tot);tot = unique(b + 1, b + 1 + tot) - (b + 1); //b去重,留下唯一的编号for(int i = 1; i <= tot; i++)  s[i] = i;    //建立并查集for(int i = 1; i <= n; i++)if(a[i].z) {                 //处理相等约束,对离散化后的新编号合并并查集int sx = find_set(get_id(a[i].x));int sy = find_set(get_id(a[i].y));s[sx] = sy;}bool ok = true;for(int i = 1; i <= n; i++)if(!a[i].z)  {            //检查不等约束是否造成矛盾int sx = find_set(get_id(a[i].x));int sy = find_set(get_id(a[i].y));if( sx == sy ){ok = false;break;}}if(ok) cout<<"Yes"<<endl;else   cout<<"No"<<endl;}return 0;
}

Java代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Main {static class Node {int x, y, z;Node(int x, int y, int z) {this.x = x;this.y = y;this.z = z;}}static Node[] a = new Node[1000010];static int tot;static int[] b = new int[2000010];static int[] s = new int[2000010];static int get_id(int x) {return Arrays.binarySearch(b, 1, tot + 1, x);}static int find_set(int x) {if (x != s[x])  s[x] = find_set(s[x]);return s[x];}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int T = Integer.parseInt(br.readLine());while (T-- > 0) {int n = Integer.parseInt(br.readLine());tot = 0;for (int i = 1; i <= n; i++) {String str = br.readLine();int x = 0, y = 0;if (str.contains("!")) {String[] split = str.split(" != ");x = Integer.parseInt(split[0].substring(1));y = Integer.parseInt(split[1].substring(1));a[i] = new Node(x, y, 0);} else {String[] split = str.split(" = ");x = Integer.parseInt(split[0].substring(1));y = Integer.parseInt(split[1].substring(1));a[i] = new Node(x, y, 1);}b[++tot] = a[i].x;b[++tot] = a[i].y;}Arrays.sort(b, 1, tot + 1);tot = deduplicate(b, tot);for (int i = 1; i <= tot; i++)   s[i] = i;for (int i = 1; i <= n; i++) {if (a[i].z == 1) {int sx = find_set(get_id(a[i].x));int sy = find_set(get_id(a[i].y));s[sx] = sy;}}boolean ok = true;for (int i = 1; i <= n; i++) {if (a[i].z == 0) {int sx = find_set(get_id(a[i].x));int sy = find_set(get_id(a[i].y));if (sx == sy) {ok = false;break;}}}if (ok)   System.out.println("Yes");else      System.out.println("No");}}static int deduplicate(int[] b, int n) { // 去重int p = 1;for (int i = 2; i <= n; i++)if (b[i] != b[p])b[++p] = b[i];return p;}
}

Python代码

   用bisect.bisect_left()离散化,用set去重。

#pypy
import sys
sys.setrecursionlimit(10000)
import bisect
input = sys.stdin.readline
def get_id(x):  return bisect.bisect_left(b, x)
def find_set(x):if x != s[x]:    s[x] = find_set(s[x])return s[x]
T = int(input())
for _ in range(T):n = int(input())a = []b = []for i in range(n):str = input()x, y = 0, 0if "!" in str:split = str.split(" != ")x = int(split[0][1:])y = int(split[1][1:])a.append([x, y, 0])else:split = str.split(" = ")x = int(split[0][1:])y = int(split[1][1:])a.append([x, y, 1])b.append(a[i][0])b.append(a[i][1]) b = sorted(set(b))tot = len(b)s = [i for i in range(tot)]for i in range(n):if a[i][2] == 1:sx = find_set(get_id(a[i][0]))sy = find_set(get_id(a[i][1]))s[sx] = syok = Truefor i in range(n):if a[i][2] == 0:sx = find_set(get_id(a[i][0]))sy = find_set(get_id(a[i][1]))if sx == sy:ok = Falsebreakif ok:  print("Yes")else:   print("No")

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

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

相关文章

ADC介绍

简介&#xff1a; Successive Approximation ADC&#xff08;SAR ADC&#xff09;&#xff1a;逐次逼近ADC&#xff0c;SAR ADC。 主要用于测量电压信号。特性如下&#xff08;来自公开资料&#xff09;&#xff1a; 10bits resolutionUp to 1MS/s sampling rate4 single-en…

Texlive2023与Texstudio2023卸载与安装(详细全程)

早在两年前安装了texlive2020&#xff0c;最近重新使用总是报错&#xff0c;好像是因为版本过低。我就找了个时间更新一下texlive版本&#xff0c;全程如下。 1、卸载texlive老版本 1&#xff09;找到texlive目录&#xff0c;比如我的是D:\texlive\2022\tlpkg\installer&…

链路聚合原理

文章目录 一、定义二、功能三、负载分担四、分类五、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、定义 在网络中&#xff0c;端口聚合是一种将连接到同一台交换机的多个物理端口捆绑在一起&#xff0c;形成一个逻辑端口的技术。通过端口聚合&…

Llama模型结构解析(源码阅读)

目录 1. LlamaModel整体结构流程图2. LlamaRMSNorm3. LlamaMLP4. LlamaRotaryEmbedding 参考资料&#xff1a; https://zhuanlan.zhihu.com/p/636784644 https://spaces.ac.cn/archives/8265 ——《Transformer升级之路&#xff1a;2、博采众长的旋转式位置编码》 前言&#x…

Uniapp笔记(五)uniapp语法4

本章目标 授权登录【难点、重点】 条件编译【理解】 小程序分包【理解】 一、授权登录 我的模块其实是两个组件&#xff0c;一个是登录组件&#xff0c;一个是用户信息组件&#xff0c;根据用户的登录状态判断是否要显示那个组件 1、登录的基本布局 <template><…

【java】【已解决】IDEA启动报错:Lombok Requires Annotation Processing

解决办法&#xff1a; 1、根据异常提示操作&#xff1a; 直接点击错误提示后面的蓝色标识【Enable】&#xff08;小编点完了所以变灰色&#xff09;&#xff0c;此操作等价于下面的步骤&#xff1a; 【File】-->【Settings】-->【Build】-->【Compiler】-->【Ann…

【数学建模】-- 模糊综合评价

模糊综合评价&#xff08;Fuzzy Comprehensive Evaluation&#xff09;是一种用于处理不确定性和模糊性信息的决策分析方法。它通常用于解决复杂的多指标决策问题&#xff0c;其中各指标之间可能存在交叉影响和模糊性的情况。模糊综合评价通过将不确定性和模糊性量化&#xff0…

curl封装

一。由于工作的原因&#xff0c;需要对curl做一些封装&#xff0c;附加上我们的证书&#xff0c;提供给第三个C和jAVA使用。 二。头文件封闭四个函数&#xff0c;get&#xff0c;post&#xff0c;download&#xff0c;upload #ifndef CURLHTTP_H #define CURLHTTP_H#include …

MongoDB实验——MongoDB配置用户的访问控制

MongoDB 配置用户的访问控制 一、 实验原理 理解admin数据库&#xff1a;安装MongoDB时&#xff0c;会自动创建admin数据库&#xff0c;这是一个特殊数据库&#xff0c;提供了普通数据库没有的功能&#xff0c;例如&#xff0c;有些账户角色赋予用户操作多个数据库的权限&…

地下管线三维自动建模软件MagicPipe3D V3.0发布

2023年9月1日经纬管网建模系统MagicPipe3D V3.0正式发布&#xff0c;该版本经过众多用户应用和反馈&#xff0c;在三维地下管网建模效果、效率、适配性方面均有显著提升&#xff01;MagicPipe3D本地离线参数化构建地下管网模型&#xff08;包括管道、接头、附属设施等&#xff…

0基础学习VR全景平台篇 第94篇:智慧景区浏览界面介绍

一、景区详细信息介绍 点击左上角的图标就可以看到景区详细信息例如景区简介&#xff0c;地址&#xff0c;开放信息&#xff0c;联系电话等 二、问题反馈中心 点击左下角的【问题反馈】按钮向作者进行问题反馈 三、开场地图 1、直接点击开场地图页面上的图标浏览该场景 2、通…

idea新建Java-maven项目时,出现Dependency ‘ xxx(jar包名)‘ not found的解决方案

项目场景&#xff1a; 项目场景&#xff1a;使用idea创建maven项目时&#xff0c;导入简单依赖时&#xff08;本文以mysql-connector-java为例&#xff09;。 问题描述 问题&#xff1a; 首先&#xff0c;在创建新的maven项目中&#xff0c;出现下列两种情况&#xff1a; &am…

hp惠普光影精灵5笔记本HP Pavilion Gaming-15-dk0135tx原装出厂Win10系统

原厂系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、惠普电脑管家等预装程序 适用型号&#xff1a; 15-dk0011tx,15-dk0018tx,15-dk0019tx,15-dk0020tx,15-dk0021tx,15-dk0038tx 15-dk0039tx,15-dk0040tx,15-dk0041tx,15-dk0125tx,15-dk0126tx,15-dk0127tx 15-dk012…

1.2 BEV感知算法数据形式

本文来自自动驾驶之心知识星球的国内首个BEV感知全栈系列学习教程 Birds-eye-view (BEV) Perception: A Survey and Collection 什么是图像 1. 图像是由相机生成的&#xff0c;是将三维世界 中的坐标点&#xff08;单位为米&#xff09;映射到二维 图像平面&#xff08;单位像…

图像翻拍检测——反射分量分离的特征融合

随着计算机技术的迅速发展&#xff0c;需要建立人与信息一一对应的安保认证技术&#xff0c;通过建立完整的映射网络体系&#xff0c;从而确保每个人的人身、财产、隐私等的安全.与指纹、基因等人体生物特征识别系统相比&#xff0c;人脸识别系统更加友好&#xff0c;不需要人的…

2023有哪些更好用的网页制作工具

过去&#xff0c;专业人员使用HTMLL、CSS、Javascript等代码手动编写和构建网站。现在有越来越多的智能网页制作工具来帮助任何人实现零代码基础&#xff0c;随意建立和设计网站。在本文中&#xff0c;我们将向您介绍2023年流行的网页制作工具。我相信一旦选择了正确的网页制作…

【Terraform学习】使用 Terraform创建 S3 存储桶事件(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

ATF(TF-A)安全通告 TFV-4 (CVE-2017-9607)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-4 (CVE-2017-9607) 二、CVE-2017-9607 一、ATF(TF-A)安全通告 TFV-4 (CVE-2017-9607) Title 错误的固件更新SMC可能导致在AArch32状态下复制或验证安全内存中的意外数据 CVE ID C…

树多选搜索查询,搜索后选中状态仍保留

<template><div class"half-transfer"><div class"el-transfer-panel"><div><el-checkbox v-model"selectAll" change"handleSelectAll">全部</el-checkbox></div><el-input v-model&qu…

journal日志导致服务器磁盘满

背景 ubuntu 18.04服务器磁盘突然100% 一查/var/log/journal目录占了14G 清理 要清理 journal 日志&#xff0c;可以使用以下步骤&#xff1a; 运行以下命令来查看 journal 日志的使用情况&#xff1a; journalctl --disk-usage这将显示 journal 日志的当前使用情况&#x…