Description:
Input:
Output:
Sample Input:
10 5 1 2 even 3 4 odd 5 6 even 1 6 even 7 10 odd
Sample Output:
3
题意:有一个只包含0和1的序列,现在有些问题及其答案(问题是从a位置到b位置有偶数个1还是奇数个1),判断最早的那个不对的答案的位置,输出即可,但是由于这道题的取值范围比较大,所以需要离散化处理,(算是再次让我复习了一下)。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int N=100100; struct node { int a, b, c; }no[N]; int f[N], Hash[N], r[N]; ///Hash数组存放离散化处理后的数据 int Find(int x) { int k = f[x]; if (f[x] != x) { f[x] = Find(f[x]); r[x] = (r[x]+r[k])%2; } return f[x]; } int main () { int n, m, a, b, k, na, nb, i; char s[10]; while (scanf("%d", &n) != EOF) { k = 0; scanf("%d", &m); for (i = 0; i < m; i++) { scanf("%d %d %s", &a, &b, s); no[i].a = a; no[i].b = b; if (s[0] == ‘e‘) no[i].c = 0; else no[i].c = 1; Hash[k++] = a; Hash[k++] = a-1; Hash[k++] = b; Hash[k++] = b-1; } sort(Hash, Hash+k); ///排序 k = unique(Hash, Hash+k)-Hash; ///去重 for (i = 0; i < k; i++) { f[i] = i; r[i] = 0; } for (i = 0; i < m; i++) { a = lower_bound(Hash, Hash+k, no[i].a-1)-Hash; ///二分查找no[i].a-1在Hash数组中的位置 b = lower_bound(Hash, Hash+k, no[i].b)-Hash; na = Find(a); nb = Find(b); if (na == nb && (no[i].c+r[b])%2 != r[a]) break; else if (na < nb) { f[na] = nb; r[na] = ((no[i].c-r[a])+r[b]+2)%2; } else if (na > nb) { f[nb] = na; r[nb] = ((r[a]-no[i].c)-r[b]+2)%2; } } printf("%d\n", i); } return 0; }
原文:http://www.cnblogs.com/syhandll/p/4854543.html