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;
}
posted @   纯粹的  阅读(21)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示