poj1733
题解:数据太大需要离散化,一道并查集的简单题
代码:
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int const N = 10000 + 10;
int n,k,fa[N],sum[N],l[N],r[N],flag[N];
string s;
vector<int>ve;
void Init(){
cin>>n>>k;
ve.clear();
for(int i=0;i<N;i++)
fa[i] = i,sum[i] = 0;
for(int i=1;i<=k;i++){
cin>>l[i]>>r[i]>>s;
--l[i];
if(s[0] == 'e') flag[i] = 0;
else flag[i] = 1;
ve.push_back(r[i]);
ve.push_back(l[i]);
}
sort(ve.begin(),ve.end());
ve.erase(unique(ve.begin(),ve.end()),ve.end());
}
int find(int x){
if(x != fa[x]){
int tmp = fa[x];
fa[x] = find(fa[x]);
sum[x] ^= sum[tmp];
}
return fa[x];
}
int main(){
ios::sync_with_stdio(false);
Init();
int ans = 0;
for(int i=1;i<=k;i++){
int x = lower_bound(ve.begin(),ve.end(),l[i]) - ve.begin();
int y = lower_bound(ve.begin(),ve.end(),r[i]) - ve.begin();
int fx = find(x), fy = find(y);
if(fx != fy){
fa[fy] = fx;
sum[fy] = sum[x] ^ sum[y] ^ flag[i];
}else{
if(sum[x] ^ sum[y] != flag[i]){
if(!ans){
ans = i;
break;
}
}
}
}
if(!ans) ans = k + 1;
cout<<ans-1<<endl;
return 0;
}