B. Equal XOR
题解
一看无从下脑,不妨造几个样例观察观察
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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步