题解 CF787B 【Not Afraid】

rui_er

2020-09-04 23:12:49

Solution

题意简述:有 $2\times n$ 个人,编号分别为 $-n,-n+1,\cdots,-1,1,2,\cdots,n$,其中编号为相反数的两个人中有一个叛徒和一个好人。现在有 $m$ 个团队,知道团队成员的编号,问是否可能存在一个团队,所有人都是叛徒。 --- 思路: 怎么保证一个团队至少有一个好人呢?我们知道编号为 $i$ 和 $-i$ 的两个人中有一个叛徒、一个好人,因此如果**存在** $i\in\left[1,n\right]$,满足 $i$ 和 $-i$ 编号的两个人在同一个团队里,那个团队就会有好人。 反过来,如果对于**所有** $i\in\left[1,n\right]$,$i$ 和 $-i$ 不同时在一个团队里,那么那个团队有可能全部都是叛徒——让团队中的那些人全为叛徒,相反数编号不在团队里,全为好人,即可构造。 因此,本问题转换为:求每一个团队中是否存在一对相反数。我们用一个映射(map)来记录出现过的数,然后统计即可。 --- 代码: ```cpp //By: Luogu@rui_er(122461) #include <bits/stdc++.h> using namespace std; int n, m; map<int, int> mp; int main() { scanf("%d%d", &n, &m); for(int i=1;i<=m;i++) { int _; scanf("%d", &_); mp.clear(); bool ok = false; while(_--) { int x; scanf("%d", &x); if(mp[-x]) ok = true; mp[x] = 1; } if(!ok) return puts("YES"), 0; } puts("NO"); return 0; } ```