当前位置: 代码迷 >> 综合 >> MEXor Mixup(思维题)
  详细解决方案

MEXor Mixup(思维题)

热度:26   发布时间:2023-11-23 22:02:27.0

题目

MEXor Mixup


问题描述

给定两个值 a a a b b b,满足 a > 0 a>0 a>0, b ≥ 0 b\geq0 b0
若有一个非负整数数组,使得其中所有元素经过Mex运算的结果为 a a a,其中所有元素经过XOR操作的结果为 b b b
问满足这些条件的数组的最小长度为多少。


分析

关于 M e x Mex Mex运算的内容可以见于我之前的博客——SG函数介绍

mex(S)表示不属于集合S的最小非负整数。

也就是在非负整数中,先除去S,然后在剩余的非负整数中取最小值。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。

若mex{S}为 a a a,就说明小于 a a a的非负整数已经包含在数组当中了,也就是说,这个数组至少包含了小于 a a a a a a个非负整数且不包含元素 a a a,至于大于 a a a的元素,还不清楚。

接下来就是对条件二的讨论:所有元素经过XOR操作的结果为 b b b
设数组C用来储存前缀异或和,那么就可以分出三种情况,
情况一:C[a-1]==b,意味着无需额外的元素就满足了条件二,输出a即可;

情况二:C[a-1]==a,意味着所需要的那个元素恰好为不可取的a,那么就需要用另外两个元素异或的结果来替代这个元素,输出a+2;

情况三;C[a-1]!=a,意味着所需要的那个元素可以直接加入数组,所以输出a+1即可。

代码

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
int t;
int a,b;
int c[300006];
int main(){
    for(int i=1;i<300006;i++){
    c[i]=c[i-1]^i; }while(cin>>t){
    while(t--){
    cin>>a>>b;if(c[a-1]==b)cout<<a;else if((c[a-1]^b)==a)cout<<a+2;else cout<<a+1;cout<<endl;}}return 0;
}