CodeForces 1323D本ビット・コンピューティング[]

ポータル

問題の意味

列の数に\(A_1、A_2、...、A_N \) 求めている\((A_1 + A_2)\ oplus(A_1 + A_3)\ oplus ... \ oplus(A_1 + A_N)\ oplus(A_2 + A_3) \ Oplus ... \ Oplus(A_2 A_N +)\ Oplus ... \ Oplus(A_ {} 1-N-A_N +)\)
"\ (\ Oplus \)は、" XOR演算です。

問題の解決策

アイデアは非常に巧妙なビット算術思考の質問、100人について、それを行うにはゲーム全体でDIV2フィールドで、非常に精通ビットコンピューティングではない人々のための難易度が比較的大きいです。
その答えは、すべてのビットが0または1であると考えられます。検討最初\(\ W)の奇数がある場合、位置\(a_iを+ a_j \)最初の\(W \)ビットが\(1 \) 次いで、答えは(\ w)の\ビットが(\ 1)\\(a_iを\)各番号の以下より\(W \)ビットのうち形態\(B_i \) すなわち構成コラムの数(B \)\、そう\(b_i = a_iを\&( 2 ^ {W + } -1。1)\)、\ (a_iを\)よりも大きい(W \)\する位置\(W \)ビットが影響を受けるものではありません。今では中に見出すことができる\(B_i \)最小\(1 \) 最大\(1 + W 2 ^ {-1} \) そう\(b_i + b_j \)間隔の値
\([2,2 ^ {W + 2} -2] \) の内部が、この時間は作る\(W \)ビットが\(1 \) 次いで\(b_i + b_j \)であるべきである(\ [2 ^ 2、W ^ { -1 + 1 W}] \カップ[2 ^ {W + 1} + 2 ^ 2、W ^ {W 2 +} -2] \) で、それがいると判定された場合(\ b_i \) 満足\(b_i + b_j \)\(W \)ビット\(1 \)\(b_j \)間隔で\([2 ^ W-b_i 、2 ^ {1 + W} -1- b_i] \カップ[2 ^)+ 2 ^ W-b_i、2 ^ {W + 2} -2- b_i] \ {+ 1、W}は次いで(b_j \)\数が要件を満たすことです\(b_i + b_j \)数について。これは単に、比較的単純必要です\(B \)列挙を命じた(B_i \)\で、(B_1、B_2、...、\ B_ {I-1} \) の要件を満たすために探しています\(b_j \)その上に番号、理由\(B \)秩序あるので直接LOWER_BOUNDとUPPER_BOUNDが容易含まれる間隔数の数を解決することができます。合計場合最後に、\(b_j \)の数が奇数である場合、答え(\ W)\ビットが\(1 \)
複雑\(O(NlogNlogC)\) おそらく最悪が到着した、カウント\(2 \回10 ^ 8 \) 世界最速、1秒の価値があるレベルが、CFの評価機を、よりRANすることができ

コード

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=4e5+10;
const int M=1e7+10;
int n,a[N],b[N],ans;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int w=0;w<=24;w++){
        for(int i=1;i<=n;i++) b[i]=a[i]&(1<<w+1)-1;
        sort(b+1,b+n+1);
        LL temp=0;
        for(int i=1;i<=n;i++){
            int posl=lower_bound(b+1,b+i,(1<<w)-b[i])-b;
            int posr=upper_bound(b+1,b+i,(1<<w+1)-1-b[i])-b;
            temp+=posr-posl;
            posl=lower_bound(b+1,b+i,(1<<w+1)+(1<<w)-b[i])-b;
            posr=upper_bound(b+1,b+i,(1<<w+2)-2-b[i])-b;
            temp+=posr-posl;
        }
        if(temp%2==1) ans+=(1<<w);
    }
    cout<<ans<<endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/BakaCirno/p/12443264.html