题目
Input
3
1 3 1 2 3
2 1 1
1 3 1 2 4
Output
1
Input
5
1 3 1 2 3
1 3 1 2 4
1 3 1 2 5
1 3 1 2 7
2 1 8
Output
2
Input
2
1 2 10 11
2 2 10 11
Output
0
题意:给出一个数n,下面是n个人,每个人的开头有一个数1或2后面跟着一个数m,如果是一的话表示后面是这个人喜欢的m个数,否则为厌恶的m个数.问:有多少的个数是所有人都喜欢的,输出这个数.
思路:我们可以把所有人喜欢的数都存起来,再把所有人厌恶的再减去,不过要注意可能没有喜欢的只有厌恶的,这样的话用1e18减去厌恶的即可
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<sstream>
#include<queue>
using namespace std;
map<long long int ,int>mp;
map<long long int,int>mpp;
long long int a[250000],b[250000];
int main()
{
ios::sync_with_stdio(0);
mp.clear();
mpp.clear();
long long int l=0,r=0,g=0;
int n;
cin>>n;
while(n--)
{
int p;
cin>>p;
if(p==1)
{
int q;
g++;//喜欢数字的人数
long long int x;
cin>>q;
// printf(" %d \n",q);
for(int i=0;i<q;i++)
{
cin>>x;
if(mp[x]==0)a[l++]=x;//喜欢的数字
mp[x]++;
}
}
else{
int q;
long long int x;
cin>>q;
for(int i=0;i<q;i++)
{
cin>>x;
if(mpp[x]==0)b[r++]=x;//厌恶的数字
mpp[x]++;
}
}
}
if(l>0)//喜欢数字的人数大于0
{
long long int s=0;
for(int i=0;i<l;i++)
if((mp[a[i]]==g)&&(mpp[a[i]]==0))s++;//每个人都喜欢这个数字并且没有人厌恶他
printf("%lld\n",s);
}
else//所有的人都厌恶数字
{
long long int v=1000000000000000000;
printf("%lld",v-r);
}
}