前排求助,48分
查看原帖
前排求助,48分
520777
LaoXu666楼主2024/3/3 13:52
#include <iostream>
#include <vector>

#define MAXN 300005
int N, Q;
int Prev[MAXN];
std::vector<int> Graph[MAXN];
std::pair<int, int> Query[MAXN];
bool Flag[MAXN];
int Ans[MAXN];

class UFS {
public:
	int Tree[MAXN];

	void Init() {
		for (int i = 0; i < MAXN; i++)
			Tree[i] = i;
	}

	int FindRoot(int X) {
		if (Tree[X] == X) return X;
		return FindRoot(Tree[X]);
	}

	void Union(int Node1, int Node2) {
		int Root1 = FindRoot(Node1), Root2 = FindRoot(Node2);
		if (Root1 == Root2) {
			Tree[Root1] = Tree[Root2] = 0;
		} else {
			Tree[Root2] = Root1;
		}
	}

	void Union2(int Node1, int Node2) {
		int Root1 = FindRoot(Node1), Root2 = FindRoot(Node2);
		Tree[Root2] = Root1;
	}
} P6706_Main;

bool Visit[MAXN];

void Set(int Node1, int Root) {
	Visit[Node1] = true;
	P6706_Main.Union2(Root, Node1);
	for (int Node2: Graph[Node1]) {
		if (Flag[Node2] || Visit[Node2]) continue;
		Set(Node2, Root);
	}
}

int main() {
	std::cin >> N;
	for (int i = 1; i <= N; i++) {
		std::cin >> Prev[i];
		if (Prev[i]) Graph[Prev[i]].push_back(i);
	}
	P6706_Main.Init();
	std::cin >> Q;
	for (int i = 1; i <= Q; i++) {
		std::cin >> Query[i].first >> Query[i].second;
		if (Query[i].first == 2) {
			Flag[Query[i].second] = true;
		}
	}
	//std::cout << "" << "" << "" << "";
	for (int i = 1; i <= N; i++) {
		int Root = i;
		if (!Visit[i]) {
			while (!Flag[Root] && Prev[Root] != 0) {
				Root = Prev[Root];
				if (Visit[Root]) {
					P6706_Main.Union(0, Root);
					break;
				}
				Visit[Root] = true;
			}
			//std::cout << "" << "" << "" << "";
			Set(Root, Root);
			//std::cout << "" << "" << "" << "";
		}
	}
	//std::cout << "" << "" << "" << "";
	for (int i = Q; i >= 1; i--) {
		if (Query[i].first == 1) {
			Ans[i] = P6706_Main.FindRoot(Query[i].second);
		} else {
			P6706_Main.Union(Prev[Query[i].second], Query[i].second);
		}
	}
	for (int i = 1; i <= Q; i++) {
		if (Query[i].first == 1) {
			if (Ans[i] != 0) std::cout << Ans[i] << '\n';
			else std::cout << "CIRCUS\n";
		}
	}
	return 0;
}

rt,谁来帮我 (不知道有没有固态硬盘)

2024/3/3 13:52
加载中...