题目大意

给你 $m$ 组数列,每组数列中有 $t$ 个数,数列中的每个数的绝对值不超过 $n$,两个互为相反数的数中一个是叛徒,一个是好人,现让你判断其中是否有一个数列有全是叛徒的可能,只要有一个数列有就输出 YES,否则输出 NO

思路

因为只要某个数列中的某个数在这个序列中找不到相反数就有可能是叛徒,所以我们可以用两个数组 $a$ 和 $b$ 分别储存正数和负数。

$a{i}$ 表示数列中是否有 $i$,$b{i}$ 表示数列中是否有 $-i$。

所以我们只需要判断数列中是否有 $a{i} = 1 \operatorname{and} b{i}=1$,只要有一组,就说明不可能全是叛徒,输出 NO,如果都没有,说明有可能全是叛徒,输出 YES

注意事项

两个数组和标记每次循环前要清零,如果已经判定要输出 YES 时但数据还没有输入完要等输入完再输出(只是为了好看点)。

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>
using namespace std;
int n,m,t,x;
bool f,ff;
int main(){
cin>>n>>m;
while(m--){
cin>>t;
f=0;
int a[114514]={0},b[114514]={0};
for(int i=1;i<=t;i++){
cin>>x;
if(x<0){
b[abs(x)]=1;
if(a[abs(x)]==1){
f=1;
}
}
if(x>0){
a[x]=1;
if(b[x]==1){
f=1;
}
}
}
if(f==0){
ff=1;
}//等待输入完成
}
if(ff){
cout<<"YES";
return 0;
}
cout<<"NO";
return 0;
}