很简单的一道L2,直接使用unoredred_map记录两个数组的交集和并集即可。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef long long ll;
const int N = 1010;
const int mod = 998244353;
void solve() {int n;cin>>n;vector<vector<int>> a(n+1);for(int i = 1 ; i <= n ; i++){int m;cin>>m;for(int j = 1 ; j <= m ; j++){int x;cin>>x;a[i].push_back(x);}}int k;cin>>k;for(int i = 1 ; i <= k ; i++){int x,y;cin>>x>>y;unordered_map<int,int> mp1,mp2;for(int j = 0 ; j < a[x].size() ; j++){mp1[a[x][j]]++;}for(int j = 0 ; j < a[y].size() ; j++){if(mp1[a[y][j]]){ //在第一个集合中出现,就放到mp2中,mp2的长度就是交集的大小mp2[a[y][j]]++;}}int n1 = mp2.size();for(int j = 0 ; j < a[y].size() ; j++){mp1[a[y][j]]++;}int n2 = mp1.size();double ans = n1 * 1.0 / n2 * 100.0;printf("%.2lf%\n",ans);}
}
signed main() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);int tt = 1;// cin >> tt;while (tt--) {solve();}return 0;
}