1063. Set Similarity (25) 并查集
2016-03-09 13:50
302 查看
传送门://https://www.patest.cn/contests/pat-a-practise/1063AC 代码. 不难,典型的并查集考察.#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <stack>
#include <set>
#include <cmath>
#include <map>
using namespace std;
int main(){
int n,k,t,m,query1,query2;
scanf("%d",&n);
vector<set<int>> ans;
for (int i=0; i<n; ++i) {
scanf("%d",&k);
set<int> s;
for (int j=0; j<k; ++j) {
scanf("%d",&t);
s.insert(t);
}
ans.push_back(s);
}
scanf("%d",&m);
for (int i=0; i<m; ++i) {
scanf("%d %d",&query1,&query2);
query1--;
query2--;
vector<int> diff(ans[query1].size()+ans[query2].size());
vector<int> unio(ans[query1].size()+ans[query2].size());
auto it = set_intersection(ans[query1].begin(),ans[query1].end(), ans[query2].begin(), ans[query2].end(), diff.begin());
diff.resize(it-diff.begin());
it = set_union(ans[query1].begin(),ans[query1].end(), ans[query2].begin(), ans[query2].end(), unio.begin());
unio.resize(it-unio.begin());
int len1 = (int)diff.size(),len2 =(int)unio.size();
double r = len1*100.0/(len2*1.0);
printf("%.1lf%%\n",r);
}
return 0;
}
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <stack>
#include <set>
#include <cmath>
#include <map>
using namespace std;
int main(){
int n,k,t,m,query1,query2;
scanf("%d",&n);
vector<set<int>> ans;
for (int i=0; i<n; ++i) {
scanf("%d",&k);
set<int> s;
for (int j=0; j<k; ++j) {
scanf("%d",&t);
s.insert(t);
}
ans.push_back(s);
}
scanf("%d",&m);
for (int i=0; i<m; ++i) {
scanf("%d %d",&query1,&query2);
query1--;
query2--;
vector<int> diff(ans[query1].size()+ans[query2].size());
vector<int> unio(ans[query1].size()+ans[query2].size());
auto it = set_intersection(ans[query1].begin(),ans[query1].end(), ans[query2].begin(), ans[query2].end(), diff.begin());
diff.resize(it-diff.begin());
it = set_union(ans[query1].begin(),ans[query1].end(), ans[query2].begin(), ans[query2].end(), unio.begin());
unio.resize(it-unio.begin());
int len1 = (int)diff.size(),len2 =(int)unio.size();
double r = len1*100.0/(len2*1.0);
printf("%.1lf%%\n",r);
}
return 0;
}
相关文章推荐
- SonarQube 代码质量管理平台的安装和使用
- Android studio如何使用SVN进行版本控制?
- 如何利用CSS代码使图片和文字在同一行显示且对齐
- Linux 的启动流程
- BZOJ 1505: [NOI2004]小H的小屋
- Find The Duplicate Number
- 【图论】单源点最短路模板(有向图)Dijkstra
- QT5串口通信
- Android四大组件Broadcast Receiver详解
- JavaScript中url 传递参数(特殊字符)解决方法
- VC 测试一段程序的运行时间 精确到ms
- [POJ 2823]Sliding Window[单调队列]
- Maven 安装
- PAT-Shuffling Machine (20)
- EnumSet源码分析
- Maven仓库管理之Nexus
- android开发时怎样让图片充满屏幕
- 标准爬虫初探,来自Python之父的大餐!
- Swift 学习有用的学习链接(此贴随学习的深入会一直更新)
- Java线程stop和suspend的废弃