Equal XOR(异或,思维)

文章目录

题目描述

给你一个长度为 2 ∗ n 2*n 2∗n 的数组 a a a ,它由 1 1 1 到 n n n 的每个整数组成,每个整数包含 2 2 2 次。同时给你一个整数 k ( 1 ≤ k ≤ ⌊ n 2 ⌋ ) k(1≤k≤⌊\frac{n}{2}⌋) k(1≤k≤⌊2n⌋) 。

你需要找出两个长度分别为 2 ∗ k 2*k 2∗k 的数组 l l l 和 r r r,使得:

  • l l l 是 [ a 1 , a 2 , ... a n ] [a_1,a_2,...a_n] [a1,a2,...an] 的子集。
  • r r r 是 [ a n + 1 , a n + 2 , . . . , a 2 n ] [a_{n+1},a_{n+2},...,a_{2n}] [an+1,an+2,...,a2n] 的子集。
  • l l l 元素的异或等于 r r r 元素的异或。换句话说: l 1 ⊕ l 2 ⊕ . . . ⊕ l 2 k = r 1 ⊕ r 2 ⊕ . . . r 2 k l_1⊕l_2⊕...⊕l_{2k}=r_1⊕r_2⊕...r_{2k} l1⊕l2⊕...⊕l2k=r1⊕r2⊕...r2k 的子集。

至少有一对 l l l 和 r r r 是存在的。如果有多个解,可以输出其中任意一个。

序列 x x x 是序列 y y y 的子集,如果 x x x 可以通过删除 y y y 中的几个元素(可能一个元素也没有或全部元素)并按任意顺序重新排列而得到。例如, [ 3 , 1 , 2 , 1 ] [3,1,2,1] [3,1,2,1] 、 [ 1 , 2 , 3 ] [1,2,3] [1,2,3]、 [ 1 , 1 ] [1,1] [1,1] 和 [ 3 , 2 ] [3,2] [3,2] 是 [ 1 , 1 , 2 , 3 ] [1,1,2,3] [1,1,2,3] 的子集,但 [ 4 ] [4] [4] 和 [ 2 , 2 ] [2,2] [2,2] 不是 [ 1 , 1 , 2 , 3 ] [1,1,2,3] [1,1,2,3] 的子集。

输入格式

第一行包含 2 2 2 个整数 n n n 和 k k k ( 2 ≤ n ≤ 5 ⋅ 1 0 4 , 1 ≤ k ≤ ⌊ n 2 ) (2≤n≤5⋅10^4 , 1≤k≤⌊\frac{n}{2}) (2≤n≤5⋅104,1≤k≤⌊2n)。

第二行包含 2 ∗ n 2*n 2∗n 个整数 a 1 , a 2 , . . . , a 2 n ( 1 ≤ a i ≤ n ) a_1,a_2,...,a_{2n}(1 \leq a_i \leq n) a1,a2,...,a2n(1≤ai≤n)。保证从 1 1 1 到 n n n 的每个整数在 a a a 中恰好出现两次。

输出格式

输出两行。

在第一行输出中,输出 2 ∗ k 2*k 2∗k 个整数 l 1 , l 2 , . . . , l 2 k l_1,l_2,...,l_{2k} l1,l2,...,l2k。

在第二行输出中,输出 2 ∗ k 2*k 2∗k 个整数 r 1 , r 2 , . . . , r 2 k r_1,r_2,...,r_{2k} r1,r2,...,r2k。

如果有多个解,可以输出其中任意一个。

样例输入1

cpp 复制代码
2 1
1 2 2 1

样例输出1

cpp 复制代码
2 1
2 1

样例输入2

cpp 复制代码
6 1
6 4 2 1 2 3 1 6 3 5 5 4

样例输出2

cpp 复制代码
6 4
1 3

样例输入3

cpp 复制代码
4 1
1 2 3 4 1 2 3 4

样例输出3

cpp 复制代码
1 2
1 2

提交链接

https://hydro.ac/d/lp728/p/9

提示

样例解释:

样例 1 1 1 中,我们选择 l = [ 2 , 1 ] l=[2,1] l=[2,1] 和 r = [ 2 , 1 ] r=[2,1] r=[2,1] 。 [ 2 , 1 ] [2,1] [2,1] 是 [ a 1 , a 2 ] [a_1,a_2] [a1,a2] 的子集, [ 2 , 1 ] [2,1] [2,1] 是 [ a _ 3 , a _ 4 ] [a\_3,a\_4] [a_3,a_4] 的子集。 2 ⊕ 1 = 2 ⊕ 1 = 3 2⊕1=2⊕1=3 2⊕1=2⊕1=3 ,满足题意。

样例 2 2 2 中, 6 ⊕ 4 = 1 ⊕ 3 = 2 6⊕4=1⊕3=2 6⊕4=1⊕3=2 ,满足题意。

解析

根据数字在 a [ 1... n ] a[1...n] a[1...n] 中出现的次数分组。

在 a [ 1... n ] a[1...n] a[1...n] 中出现 0 0 0 次的数字组与在 a [ 1... n ] a[1...n] a[1...n] 中出现 2 2 2 次的数字组大小相同。(两个区间的长度一样,每个数最多出现 2 2 2 次,平均分)

我们可以将任何 2 2 2 出现的数字添加到序列 l l l 中,也可以将任何 0 0 0 出现的数字添加到序列 r r r 中,不会出现任何问题,因为 x o r xor xor 值会抵消。

我们根据需要使用尽可能多的 1 1 1 出现数追加到 l l l 和 r r r 中。由于我们对两个序列都进行了追加, 两个序列的 x o r xor xor 值将是相同的。

参考代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n, k;
        cin >> n >> k;
        k = 2 * k;

        vector <int> a(2 * n), occ(n + 1, 0);

        for (auto &x : a) cin >> x;
        for (int i = 0; i < n; i++) occ[a[i]]++;

        vector <int> g0, g1, g2;
        for (int i = 1; i <= n; i++)
        {
            if (occ[i] == 0) g0.push_back(i);
            else if (occ[i] == 1) g1.push_back(i);
            else g2.push_back(i);
        }

        int v = 0;
        for (auto x : g2)
        {
            if (v < k)
            {
                v += 2;
                cout << x << " " << x << " ";
            }
        }
        for (auto x : g1)
        {
            if (v < k)
            {
                v++;
                cout << x << " ";
            }
        }
        cout << "\n";

        v = 0;
        for (auto x : g0)
        {
            if (v < k)
            {
                v += 2;
                cout << x << " " << x << " ";
            }
        }
        for (auto x : g1)
        {
            if (v < k)
            {
                v++;
                cout << x << " ";
            }
        }
        cout << "\n";
    }
    return 0;
}
相关推荐
小小小小王王王8 分钟前
求猪肉价格最大值
数据结构·c++·算法
岁忧32 分钟前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
BIYing_Aurora39 分钟前
【IPMV】图像处理与机器视觉:Lec13 Robust Estimation with RANSAC
图像处理·人工智能·算法·计算机视觉
martian6652 小时前
支持向量机(SVM)深度解析:从数学根基到工程实践
算法·机器学习·支持向量机
孟大本事要学习2 小时前
算法19天|回溯算法:理论基础、组合、组合总和Ⅲ、电话号码的字母组合
算法
??tobenewyorker3 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
让我们一起加油好吗3 小时前
【基础算法】贪心 (二) :推公式
数据结构·数学·算法·贪心算法·洛谷
贾全3 小时前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天4 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
满分观察网友z4 小时前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法