题目描述
•
有一个
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装进去,要验证的时候直接数组里面找,将其在数组中的编号代替其本身进行运算
还不明白?看代码吧: