并查集——奇偶性(Parity)

本文介绍了一个利用并查集解决的奇偶性问题。程序读取输入的矩阵,通过查找和合并操作判断输入的操作是否符合奇偶性约束,并在发现错误时输出错误信息的位置。最后,程序输出没有错误信息时的正确结果。
摘要由CSDN通过智能技术生成

题目描述

有一个 01 序列 , 长度 <=1000000000, 现在有 n 信息 , 每条信息的形式是- a b even/odd 。表示 a 位到第 b 位元素之间的元素总和是偶数 / 奇数。
你的任务是对于这些给定的信息,输出第一个 不正确的信息所在位置 -1 。信息的数目不超过 5000
如果信息全部正确,即可以找到一个满足要求 01 序列,那么输出 n

输入

输入文件
第一行一个整数 m 表示 01 序列的长度,第二行一个整数 n 表示信息的数目。
接下来是 n 条信息

输出

输出第一条错误信息的位置-1.

如果没有错误信息,则输出n

样例输入

10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd

样例输出

3

这道题可以用并查集的思路做

将第三行数据的1 2看做半开半闭区间( 0 , 2 ]中的所有整数元素,他们的和是偶数,可将0当做2的父亲,他们之间的距离为0(偶数mod2的余数)

以此类推,如果为奇数,则他们之间的距离为1

那么,输入x和y,找到他们各自的父亲g和h,如果g不等于h,则无需验证,将g作为h的父亲,其距离计算公式为:

s[ h ]=( s[ x ] + m - s[ y ] )%2

其中m为x到y的和的奇偶性(看不懂就慢慢想)

如果,g等于h,则进行验证,看看abs( s[ x ] - s[ y ] )%2是否满足此语句的奇偶性

整体思路到位

接下来,由于输入的x和y最大为十亿,无法开出这么大的数组,则必须将其理想化

由于只有5000条语句,所以元素最多只有10000个,则用数组将输入的x和y装进去,要验证的时候直接数组里面找,将其在数组中的编号代替其本身进行运算

还不明白?看代码吧:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值