天梯賽練習集 L2-049 魚與熊掌 查詢

把酒问青菜發表於2024-12-04


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

相關文章