边带权并查集 +离散化 acwing 239
题意: 一个01序列s,有一些关系l r odd,或者是l r even,分别代表在[l,r]区间内,有奇数个1,有偶数个1. 问最早出现冲突的下标-1. 思路: 用前缀和的思想考虑,l到r的区间,1的个数的奇偶性,就是1~(l-1)的1的个数的奇偶性和1~r的1的个数的奇偶性的关系。 如果sum[l-1]和sum[r]奇偶性相同,那么l到r的1的个数就是偶数,不同就是奇数。 用并查集去维护每个点和祖先的关系,d数组代表和祖先之间的1的个数的奇偶性,偶数为0,奇数为1。 运算规则和异或一样,偶数和偶数为偶数,奇数和奇数为偶数,奇数和偶数为奇数。 合并的时候,x,和y合并。fa[fx]=fy;要计算d[fx]。 x~y的路径:x~fx fx~fy fy~y,x和y的关系a[i].ans=d[x]^d[y]^d[fx]。 d[fx]=d[x]^d[y]^a[i].ans; #pragma warning(disable:4996) #include<algorithm> #include<cmath> #include<iostream> #include<cstdio> #include<cstring> #include<stack> #include<vector> #include<map> #include<string> #include<set> #include