统计出交集大小与并集大小,即可得出。
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
using namespace std;
int main(){
int n, m, k;
scanf("%d", &n);
vector<set<int>> sets(n+1, set<int>());
for(int i = 1; i <= n; ++i){
scanf("%d", &m);
for(int j = 0; j < m; ++j){
int num;
scanf("%d", &num);
sets[i].insert(num);
}
}
scanf("%d", &k);
for(int i = 0; i < k; ++i){
int x, y;
scanf("%d%d", &x, &y);
int sum = 0;
for(auto& n : sets[x]){
if(sets[y].find(n) != sets[y].end()) ++sum;
}
int total = (int)sets[x].size() + (int)sets[y].size() - sum;
printf("%.1f%%\n", 100*double(sum)/total);
}
return 0;
}