题意:
给定n对排斥关系,后面m个询问,问给定的t个数之间是不是存在排斥关系,存在输出No,否则输出Yes
思路:
首先把排斥关系存起来,为了减小空间,用map将标号离散化,排斥关系用set存,方面后面查找
#include<bits/stdc++.h>
#include<cstring>
#define FI first
#define SE second
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 2e4 + 7;
const int maxd = 1e6 + 7;
int n, m;
map<int, int> mp;
set<int> st[maxn];
int main() {
scanf("%d %d", &n, &m);
int id = 1;
for(int i = 1; i <= n; ++i) {
int x, y; scanf("%d%d", &x, &y);
if(!mp[x]) mp[x] = id++;
if(!mp[y]) mp[y] = id++;
st[mp[x]].insert(mp[y]);
st[mp[y]].insert(mp[x]);
}
for(int i = 1; i <= m; ++i) {
int t, x;
vector<int> vec;
scanf("%d", &t);
for(int j = 1; j <= t; ++j) {
scanf("%d", &x);
if(mp[x]) vec.push_back(mp[x]);
}
bool f = true;
for(int j = 0; j < vec.size(); ++j) {
for(int k = j+1; k < vec.size(); ++k) {
if(st[vec[j]].count(vec[k])) {
f = false;
break;
}
}
if(!f) break;
}
if(!f) puts("No");
else puts("Yes");
}
return 0;
}