好简单,一开始随便二分一下,没想到也能过,算了时间复杂度1e10
思路:存储每个人拥有物品,查询每一个人是否两个物品都有.
#include<bits/stdc++.h>
using namespace std;
vector<set<int>>vc;
int main()
{int n,m,x,y,cot;cin>>n>>m;for(int i=0;i<n;i++){cin>>x;vc.push_back({});for(int j=0;j<x;j++){cin>>y;vc[i].insert(y);}}int t;cin>>t;while(t--){cot=0;cin>>x>>y;for(int i=0;i<n;i++){if(vc[i].find(x)!=vc[i].end()&&vc[i].find(y)!=vc[i].end())cot++;}cout<<cot<<endl;}}
时间复杂度太高了,调了一下,变成1e7
思路:存储每个物品有谁有,查询时对两个物品集合求交集大小。
#include<bits/stdc++.h>
using namespace std;
vector<vector<int>>vc;
int main()
{int n,m,x,y;cin>>n>>m;for(int i=0;i<=m;i++)vc.push_back({});for(int i=0;i<n;i++){cin>>x;for(int j=0;j<x;j++){cin>>y;vc[y].push_back(i);}}int t;cin>>t;while(t--){cin>>x>>y;vector<int>ans; set_intersection(vc[x].begin(),vc[x].end(),vc[y].begin(),vc[y].end(),inserter(ans,ans.begin()));cout<<ans.size()<<endl;}}