思路:1.记录伴侣关系;
2.顺序遍历如果伴侣之一参加了,需用visi[]数组标记另一半;
3.如果看到被visi[]标记的人,说明两人均参加派对了,用print[]数组标记二人均不输出。
时间复杂度整体o(n), 但是排了次序o(n log n)。
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
int relat[N];
bool visi[N];
bool print[N];
int main()
{
ios::sync_with_stdio(false);
int n, m;
cin >> n;
memset(relat,-1,sizeof(relat));
for (int i = 0; i < n; i++)
{
int a, b;
cin >> a >> b;
relat[a] = b;//存储关系
relat[b] = a;
}
cin >> m;
int ans = 0;
vector<int>v(m);
for (int i = 0; i < m; i++)
{
int p;
cin >> p;
if (relat[p] != -1)//可能非单身
{
if (visi[p])// 2.看到对象id被标记
{
print[p] = print[relat[p]] = 1;//不打印
ans += 2;//两个成队的人
}
else
{
visi[relat[p]] = 1;// 1.提前标记对象id
}
}
v[i] = p;
}
cout << m - ans << endl;
sort(v.begin(), v.end());
bool flag = 0;
for (int i = 0; i < m; i++)
{
if (!print[v[i]])
{
if (flag) cout << ' ';
cout << setw(5) << setfill('0') << v[i];
flag = 1;
}
}
return 0;
}