B. Equal XOR

纯粹的發表於2024-03-18

原題連結

題解

一看無從下腦,不妨造幾個樣例觀察觀察

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;
}