其他分享
首页 > 其他分享> > CF1567B MEXor Mixup 题解

CF1567B MEXor Mixup 题解

作者:互联网

\(\text{Description}\)

给你两个数字 \(a\),\(b\),问使得一个非负整数数组的 \(\operatorname{MEX}\) 为 \(a\) ,数组内所有数的 \(\operatorname{XOR}\) 为 \(b\) 的最短长度。

称不属于该数组的最小非负整数为该数组的 \(\operatorname{MEX}\) ,数组的 \(\operatorname{XOR}\) 为数组所有元素的按位异或。

限制

\(1\le a\le 3\times 10^5,0\le b\le 3\times 10^5,1\le T\le 5\times 10^5\)

\(\text{Solution}\)

首先,要使 \(\text{mex}\) 为 \(a\),则需要数列中包含 \(0\sim a -1\),记 \(s = \displaystyle\bigoplus_{i=0}^{a-1}i\),则我们需要在序列中再添加一项 \(s\oplus b\),这样序列的异或和就是 \(b\) 了。

需要注意的细节:

Code


int a,b ;
int sum[300005] ;

inline void solve() {
    in(a,b) ;

    int x = sum[a - 1] ^ b;

    if (x == 0) 
        out('\n',a) ;
    else if (x == a) 
        out('\n',a + 2) ;
    else 
        out('\n',a + 1) ;
}

int main(int argc, const char **argv) {
#ifdef hpy
    freopen("std.in", "r", stdin);
    freopen("std.ans", "w", stdout);
#endif
    std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
    int t ;

    for (int i = 1; i <= 300000; ++i) 
        sum[i] = sum[i - 1] ^ i ;

    in(t) ;

    for (; t; --t) 
        solve() ; 

    std::cerr << "This program costs " << clock() << " ms" ;
    return 0 ;
}

标签:std,le,MEXor,题解,int,数组,text,Mixup,operatorname
来源: https://www.cnblogs.com/hl-fc/p/15315109.html