天天看點

[BZOJ3687][簡單題][Bitset][BZOJ3687][簡單題][Bitset]

[BZOJ3687][簡單題][Bitset]

題目一上來四個問題直接吓死我。。。

然後發現隻用做第四個問題。。。

思路:

由于最終答案求的是異或和,一個數異或另一個數兩遍還是這個數本身,是以每一個數隻有0/1兩種狀态,就可以開一個長度為最大數的Bitset,每一位代表這一位下标代表的數字是否存在。

那麼加入一個數K,就把這個Bitset整體左移K位就好了。

至于Bitset是什麼,感性的了解為一個超長的二進制就好了,可以進行二進制的任何操作。

然而這道題讀入優化會RE是什麼鬼……

代碼:

#include <bits/stdc++.h>
const int Maxn = ;
using namespace std;
int n, k;
long long ans;
bitset<Maxn> f;
int main(void) {
//  freopen("in.txt", "r", stdin);
    f[] = ;
    scanf("%d", &n);
    for (int i = ; i <= n; i++) {
        scanf("%d", &k);
        f = f ^ (f << k);
    }
    for (int i = ; i <= ; i++)
        if (f[i]) {
            ans ^= i;
        }
    printf("%lld\n", ans);
    return ;
} 
           

完。

By g1n0st