1044 火星数字
解题思路
这两题很像,这一题是1065题的升级版。1065单身狗是两两配对不重复的,即文意“不会脚踏两只船”。本题是相当于哈希表链式存储,一个人可以同时和多个人配对。
本题不可用并查集做,因为1和3配对,3和5配对但不代表1和5是一对。
解题方法是一样的,创建is数组,如果来客有配对就将其配对在is数组中赋值为1。随后遍历整个来客集合,如果is[来客]==1
,则说明与他配对的人来过,即他俩同时出现,输出No。
解决代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
map<int,vector<int>> cmp;
//vector<vector<int>> cmp(N);
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
cmp[a].push_back(b);
cmp[b].push_back(a);
}
while(m--){
vector<int> v(N),is(N);
int a,cnt=0;
cin>>a;
for(int i=0;i<a;i++){
cin>>v[i];
if(cmp[v[i]].size()){
for(auto it:cmp[v[i]]){
is[it]=1;
}
}
}
for(int i=0;i<a;i++){
if(is[v[i]]==1){
cnt=1;
break;
}
}
if(cnt) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}
测试点分析
本题起初我使用vector<vector<int>> cmp(N);
存储,但大概率测试点3、测试点4会TLE,换做map<int,vector<int>> cmp;
存储,耗时大大下降,节省3/4的时间,代码上不需有任何的改动。
原因是vector(N)会产生更多的缓存未命中,而map使用更少的内存,会显著提高命中率。
1065 单身狗
解题思路
解题思路同上题
解决代码
#include<bits/stdc++.h>
using namespace std;
const int N =1e6;
int couple[N];
int main(){
int n;
cin>>n;
vector<int> v(N,-1);
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
couple[x]=y;
couple[y]=x;
}
int m;
cin>>m;
vector<int> is(N,0),g(m),ans;
set<int> s;
for(int i=0;i<m;i++){
cin>>g[i];
if(couple[g[i]]!=-1){
is[couple[g[i]]]=1;
}
}
for(int i=0;i<m;i++){
if(is[g[i]]!=1){
ans.push_back(g[i]);
}
}
cout<<ans.size()<<endl;
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++){
printf("%05d",ans[i]);
if(i!=ans.size()-1) cout<<' ';
}
return 0;
}