90分求助 最后一个点没过
查看原帖
90分求助 最后一个点没过
496358
akk11楼主2021/12/1 16:02
#include<iostream>
#include<iomanip>
#include<string>
#include<algorithm>
#include"vector"
#include<cstring>
#include"math.h"
#include"queue"
#include"stack"
#include<map>
using namespace std;

//带权并查集 奇偶数
struct node {
	int fa;
	int length;
};
node f[100100];
int find(int x) {
	if (x == f[x].fa)
		return x;
	else {
		f[x].length = (f[f[x].fa].length + f[x].length)%2;
		f[x].fa = find(f[x].fa);
	}
	return f[x].fa;
}
int main() {
	int n, k;
	int cnt = 0;
	cin >> n >> k;
	for (int i = 0;i < 100100;i++) {
		f[i].fa = i;
		f[i].length = 0;
	}
	int flag = 0;
	map<int, int>mmp;
	for (int i = 0;i < k;i++) {
		int x, y;
		string tag;
		cin >> x >> y >> tag;
		if (flag == 1)
			continue;
		if (x > y) {
			int temp = x;
			x = y;
			y = temp;
		}
		if (mmp.find(x - 1) == mmp.end()) {
			mmp.insert({ x - 1, cnt });
			cnt++;
		}
		x = mmp[x - 1];
		if (mmp.find(y) == mmp.end()) {
			mmp.insert({ y,cnt });
			cnt++;
		}
		y = mmp[y];
		if (tag == "odd") {//奇数
			int ux = find(x);
			int uy = find(y);
			if (ux == uy && f[x].length % 2 == f[y].length % 2)
			{
				cout << i << endl;
				flag = 1;
				continue;
			}
			else {
				if (ux != uy) {
					f[uy].fa = ux;
					f[uy].length = f[x].length + 1 + f[y].length;
				}
			}
		}
		else {
			int ux = find(x);
			int uy = find(y);
			if (ux == uy && f[x].length % 2 != f[y].length % 2)
			{
				cout << i << endl;
				flag = 1;
				continue;
			}
			else {
				if (ux != uy) {
					f[uy].fa = ux;
					f[uy].length = f[x].length + f[y].length;
				}
			}
		}
	}
	if (flag == 0)
		cout << k << endl;
}
2021/12/1 16:02
加载中...