L2-049 鱼与熊掌
题目描述
《孟子 · 告子上》有名言:“鱼,我所欲也,熊掌,亦我所欲也;二者不可得兼,舍鱼而取熊掌者也。”但这世界上还是有一些人可以做到鱼与熊掌兼得的。
给定 n n n 个人对 m m m 种物品的拥有关系。对其中任意一对物品种类(例如“鱼与熊掌”),请你统计有多少人能够兼得?
输入格式:
输入首先在第一行给出 2 2 2 个正整数,分别是: n ( ≤ 1 0 5 ) n(≤10 ^5 ) n(≤105)为总人数(所有人从 1 1 1 到 n n n 编号)、 m ( 2 ≤ m ≤ 1 0 5 ) m(2≤m≤10^ 5 ) m(2≤m≤105)为物品种类的总数(所有物品种类从 1 1 1 到 m m m 编号)。
随后 n n n 行,第 i i i 行 ( 1 ≤ i ≤ n ) (1≤i≤n) (1≤i≤n)给出编号为 i i i 的人所拥有的物品种类清单,格式为:
K M[1] M[2] ... M[K]
其中 K ( ≤ 1 0 3 ) K(≤10 ^3 ) K(≤103)是该人拥有的物品种类数量,后面的 M [ ∗ ] M[*] M[∗] 是物品种类的编号。题目保证每个人的物品种类清单中都没有重复给出的种类。
最后是查询信息:首先在一行中给出查询总量 Q ( ≤ 100 ) Q(≤100) Q(≤100),随后 Q Q Q 行,每行给出一对物品种类编号,其间以空格分隔。题目保证物品种类编号都是合法存在的。
输出格式:
对每一次查询,在一行中输出两种物品兼得的人数。
输入样例:
4 8
3 4 1 8
4 7 1 8 4
5 6 5 1 2 3
4 3 2 4 8
3
2 3
7 6
8 4
输出样例:
2
0
3
代码内容
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3+10;
ll tt[N];
ll pos[N][N];
int main()
{
ll n,m;
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
ll k;
cin>>k;
tt[i]=k;
for(ll j=1;j<=k;j++)
cin>>pos[i][j];
}
ll q;
cin>>q;
ll x,y;
while(q--)
{
ll index=0;
cin>>x>>y;
for(ll i=1;i<=n;i++)
{
ll a=0,b=0;
for(ll j=1;j<=tt[i];j++)
{
if(x==pos[i][j]) a=1;
if(y==pos[i][j]) b=1;
}
if(a&&b) index++;
}
cout<<index<<endl;
}
return 0;
}