AcWing 239. 奇偶游戏
原题链接
中等
作者:
一瞬流年丶涅槃
,
2019-09-05 21:13:35
,
所有人可见
,
阅读 1182
C++ 代码
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N = 10010;
int f[N* 2], d[N* 2];
int n, m, t = 1;
struct p{
int x, y, q;
};
p arr[N];
int mp[2 * N];
int Find(int x)
{
if(x == f[x])return x;
int root = Find(f[x]);
d[x] ^= d[f[x]];
return f[x] = root;
}
void read_in()
{
cin >> n >> m;
int a, b;
string c;
for(int i = 1; i <= m; i++){
cin >> a >> b >> c;
mp[++t] = a - 1;
mp[++t] = b;
arr[i].x = a, arr[i].y = b;
if(c[0] == 'e')arr[i].q = 0;
else arr[i].q = 1;
}
sort(mp + 1, mp + t + 1);
n = unique(mp + 1, mp + 1 + t) - mp - 1;
}
int main()
{
read_in();
for(int i = 1; i <= n; i++)
f[i] = i;
bool flag = false;
for(int i = 1; i <= m; i++){
int x = lower_bound(mp + 1, mp + 1 + n, arr[i].x - 1) - mp;
int y = lower_bound(mp + 1, mp + 1 + n, arr[i].y) - mp;
int p = Find(x);
int q = Find(y);
if(p == q){
if(d[x] ^ d[y] != arr[i].q){
cout << i - 1 << endl;
flag = true;
break;
}
}
else{
f[p] = q;
d[p] = d[x] ^ d[y] ^ arr[i].q;
}
}
if(!flag)cout << m << endl;
return 0;
}