今天写到这道题的时候,突然想到了可以利用set容器的不含重复元素的特性来做这道题,感觉做法比较简单,一开始是有一个测试点超时的,但是当把cin输入改成scanf输入就刚刚好能过。
思路:用set数组(下标为人的编号)来存入每个人拥有的物品,然后对于每次询问尝试依次添加两种物品,如果两次的set的大小都不变,则说明是包含这两种的(因为set容器不会放入重复元素),如果某一次的set的大小变了,说明不包含该物品,此时要删除放入的物品,并执行下一次循环。
代码如下:
#include<iostream>
#include<set>
using namespace std;
const int N = 1e5 + 10;
int n, m, q;
int a, b, cnt;
set<int> p[N];
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++ )
{
int k;
cin >> k;
for(int j = 0 ; j < k ; j ++ )
{
int x;
scanf("%d",&x);
p[i].insert(x);
}
} //存入数据
scanf("%d",&q);
while(q -- )
{
cnt = 0;
cin >> a >> b;
for(int i = 1 ; i <= n ; i ++ )
{
int len = p[i].size(); //先存原来的大小
p[i].insert(a);
if(len != p[i].size())
{
p[i].erase(a);
continue;
}
p[i].insert(b);
if(len != p[i].size())
{
p[i].erase(b);
continue;
} //依次尝试放入两种物品
cnt ++;
}
printf("%d\n",cnt);
}
return 0;
}