标签:
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
题意:有一个长度为n的01串,有m句话,每句话说明x到y之间是有奇数(odd)个1还是偶数(even)个1;求的是前几句话是真的;如果全部为真输出m;
每输入一句话时,可以判断是否和之前的话相冲突,用r[i]表示i到i的跟节点之间1的个数是偶数还是奇数,1表示奇数,0代表偶数;
本题的n是10亿,所以不能定义一个10亿的数组;用map<int,int>定义就行
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<map> #define N 105 #define INF 0xfffffff using namespace std; //int f[N], r[N];//r[i]代表i到i的跟节点之间的关系; map<int,int> f; map<int,int> r; int Find(int x) { if(!f[x]) return x; int k = f[x]; f[x] = Find(f[x]); r[x] = (r[x]+r[k])%2; return f[x]; } int main() { int px, py, flag, ans, i, n, m, x, y, d; char str[15]; while(scanf("%d", &n)!=EOF) { flag = 0; f.clear(); r.clear(); scanf("%d", &m); for(i = 1; i <= m; i ++) { scanf("%d%d%s", &x, &y, str); x--; if(str[0] == ‘e‘)//偶数是0;奇数是1; d = 0; else d = 1; px = Find(x); py = Find(y); if(px != py) { f[px] = py; r[px] = (r[y] + d - r[x] +2)%2;//画向量图找关系; } else if(flag==0 && (2 + r[x]-r[y])%2 != d) { flag = 1; ans = i; } } if(flag==0)//如果全部都正确的话输出m;-_-在这wa了一次; ans=m+1; printf("%d\n", ans-1); } return 0; }
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<map> #define N 105 #define INF 0xfffffff using namespace std; //int f[N], r[N];//r[i]代表i到i的跟节点之间的关系; map<int,int> f; map<int,int> r; int Find(int x) { if(!f[x]) return x; int k = f[x]; f[x] = Find(f[x]); r[x] = (r[x]+r[k])%2; return f[x]; } int main() { int px, py, flag, ans, i, n, m, x, y, d; char str[15]; while(scanf("%d", &n)!=EOF) { flag = 0; f.clear(); r.clear(); scanf("%d", &m); for(i = 1; i <= m; i ++) { scanf("%d%d%s", &x, &y, str); x--; if(str[0] == ‘e‘)//偶数是0;奇数是1; d = 0; else d = 1; px = Find(x); py = Find(y); if(px < py) { f[px] = py; r[px] = (r[y] + d - r[x]+2)%2;//画向量图找关系; } else if(px > py) { f[py] = px; r[py] = (r[x] - r[y] - d + 2)%2; } else if(px==py &&flag==0 && (r[y] - r[x] + 2)%2 != d) { flag = 1; ans = i; } } if(flag==0)//如果全部都正确的话输出m;-_-在这wa了一次; ans=m+1; printf("%d\n", ans-1); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4677293.html