喂AI??
2025-07-30 09:52:59
发布于:浙江
12阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
vector<int> parent;
vector<int> key_pos;
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void unite(int x, int y) {
int fx = find(x);
int fy = find(y);
if (fx != fy) {
parent[fy] = fx;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, p;
cin >> n >> m >> p;
parent.resize(n + 2);
key_pos.resize(n + 2, 0);
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
key_pos[x] = y;
}
// 预处理连通性
for (int i = 1; i < n; i++) {
if (key_pos[i] == 0) {
unite(i, i + 1);
} else {
// 检查是否能拿到钥匙
if (find(key_pos[i]) == find(i)) {
unite(i, i + 1);
}
}
}
// 处理查询
while (p--) {
int s, t;
cin >> s >> t;
if (s == t) {
cout << "YES\n";
continue;
}
if (s < t) {
bool reachable = true;
int current = s;
while (current < t) {
if (find(current) == find(current + 1)) {
current++;
} else if (key_pos[current] != 0 && find(key_pos[current]) == find(current)) {
unite(current, current + 1);
current++;
} else {
reachable = false;
break;
}
}
cout << (reachable ? "YES" : "NO") << "\n";
} else {
bool reachable = true;
int current = s;
while (current > t) {
if (find(current) == find(current - 1)) {
current--;
} else if (key_pos[current - 1] != 0 && find(key_pos[current - 1]) == find(current)) {
unite(current, current - 1);
current--;
} else {
reachable = false;
break;
}
}
cout << (reachable ? "YES" : "NO") << "\n";
}
}
return 0;
}
这里空空如也
有帮助,赞一个