将区间x~y中1个数是偶数还是奇数转变成1~x-1和1~y两个区间里面的奇偶性相反的问题。然后通过扩展域并查集求解。
#include <bits/stdc++.h>
using namespace std;
unordered_map<int, int> mp;
int find(int x) {
return x==mp[x]? x : mp[x]=find(mp[x]);
}
void Merge(int x, int y) {
mp[find(x)] = find(y);
}
int main() {
int n, m;
cin>>n>>m;
n++;
int i;
int x1, y1;
string op;
// mp[2] = 2;
for (i=0; i<m;i++) {
cin>>x1>>y1;
if (!mp.count(x1-1)) {
// cout<<"s"<<endl;
mp[x1-1] = x1-1;
mp[x1+n-1] = x1+n-1;
}
// cout<<(mp.find(y)!=mp.end())<<endl;
if (!mp.count(y1)) {
// cout<<"s"<<endl;
mp[y1] = y1;
mp[y1+n] = y1+n;
}
cin>>op;
if (op=="even") {
if (find(x1-1)==find(y1+n)) {
break;
}
Merge(x1-1, y1);
Merge(x1+n-1, y1+n);
} else {
if (find(x1-1)==find(y1)) break;
Merge(x1-1, y1+n);
Merge(x1+n-1, y1);
}
}
cout<<i;
return 0;
}

京公网安备 11010502036488号