好簡單,一開始隨便二分一下,沒想到也能過,算了時間複雜度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;
}
}