原題連結
題解
一看無從下腦,不妨造幾個樣例觀察觀察
1 2 3 4 1 2 3 4
此時兩邊取相同值即可
此時發現無論前半邊數字的排列順序是什麼,只要是那幾個數字,就不會影響答案
所以交換前半邊和後半邊的數字會影響答案
1 2 1 4 3 2 3 4
觀察樣例發現,交換之後,兩邊會出現一對相同的數字,而它們異或值為零
再觀察題幹:一個數字一定且僅出現兩次,所以我們猜想:兩邊數字一定有相同數量的數字對,剩下的單個數字兩邊共有,把成對的數字先構造上去,剩下的再用單個數字補
code
#include<bits/stdc++.h>
using namespace std;
int a[100005]={0};
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
map<int,int> first,second;
for(int i=1;i<=2*n;i++)
{
int x;
cin>>x;
a[i]=x;
if(!first[x])first[x]=i;
else second[x]=i;
}
int cnt=2*k;
for(int i=1;i<=n&&cnt;i++)
{
if(cnt>=2&&second[i]<=n&&first[i]<=n)
{
printf("%d %d ",i,i);
cnt-=2;
}
}
for(int i=1;i<=n&&cnt;i++)
{
if(cnt>=1&&first[i]<=n&&second[i]>n)
{
printf("%d ",i);
cnt--;
}
}
puts("");
cnt=2*k;
for(int i=1;i<=n&&cnt;i++)
{
if(cnt>=2&&second[i]>n&&first[i]>n)
{
printf("%d %d ",i,i);
cnt-=2;
}
}
for(int i=1;i<=n&&cnt;i++)
{
if(cnt>=1&&first[i]<=n&&second[i]>n)
{
printf("%d ",i);
cnt--;
}
}
puts("");
}
return 0;
}