Descriptionios
Inputgit
Output數組
Sample Inputless
10 5 1 2 even 3 4 odd 5 6 even 1 6 even 7 10 odd
Sample Outputide
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; }