import java.util.Arrays;
import java.util.Scanner;
public class Main_POJ1733 {
static int[] id = new int[10005];
static int[] pre = new int[10005];
static int[] r = new int[10005]; //0代表偶數 1代表奇數
static int[] L = new int[5005];
static int[] R = new int[5005];
static int[] t = new int[5005];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int len = 1;
for(int i=1;i<=k;i++) {
L[i] = sc.nextInt()-1;
R[i] = sc.nextInt();
String s = sc.next();
id[len++] = L[i];
id[len++] = R[i]; //離散化
if(s.equals("even"))
t[i] = 0;
else
t[i] = 1;
}
Arrays.sort(id,1,len);
int cnt = 1;
for(int i=2;i<len;i++) {
if(id[i]!=id[i-1])
id[++cnt] = id[i]; //去重
}
for(int i=0;i<=cnt;i++) {
pre[i] = i;
r[i] = 0;
}
int ans = 0;
for(int i=1;i<=k;i++) {
int li = seek(L[i],cnt); //二分查找離散後的對應下標
int ri = seek(R[i],cnt);
int fx = find(li);
int fy = find(ri);
if(fx==fy) {
if((r[li]-r[ri]+2)%2!=t[i]) {
break;
}
ans++;
}else {
pre[fy] = fx;
r[fy] = (r[ri]-r[li]+t[i])%2;
ans++;
}
}
System.out.println(ans);
}
public static int seek(int key,int len) {
int l = 1,r = len;
while(l<=r) {
int m = (l+r)>>1;
if(id[m]==key)
return m;
if(id[m]>key)
r = m-1;
else
l = m+1;
}
return 0;
}
public static int find(int x) {
if(x==pre[x]) return x;
int rt = pre[x];
pre[x] = find(pre[x]);
r[x] = (r[x]+r[rt])%2;
return pre[x];
}
}
POJ-1733(Java) 帶權並查集+離散化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.