POJ-1733(Java) 帶權並查集+離散化

在這裏插入圖片描述

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];
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章