题面如下:
有一个01序列,长度n<=1000000000,现在有t条信息,每条信息的形式是:a ,b even/odd,表示第a位到第b位元素之间的元素总和是偶数/奇数。 你的任务是对于这些给定的信息,输出第一个不正确的信息所在位置-1。信息的数目不超过5000。 如果信息全部正确,那么输出t。
看到这道题的第一眼:???这竟然是并查集??怎么有点交互题的味道~~
虽然这道题对于大佬们来说so easy,但我这样的蒟蒻道行还是不够。
开始正文:
对于这道题,我们并不一定要求出原序列到底是什么样子的(当然,我们也求不出来),但是,我们可不可以从另一个角度来考虑一下。既然不能求出具体的值,那我是不是只要维护奇偶性就可以了呢?
答案是显然的。就比如,输入:34,45,even,这就相当于 s u m [ 45 ] − s u m [ 33 ] sum[45]-sum[33] sum[45]−sum[33]的值为偶数(sum数组指前缀和,这里只是为了帮助理解而使用的,代码中用不上),也就是意味着, s u m [ 45 ] sum[45] sum[45]和 s u m [ 33 ] sum[33] sum[33]的奇偶性相同。那么,我们就可以对33和45进行并查集的维护了。
同理,若输入为: L , R , o d d / e v e n L,R,odd / even L,R,odd/even,若输入为 o d d odd odd,则代表