タイトル説明
最近SmallBellは苦しむ、Loveliveを中毒[天使のビート] FCです。彼がどのようなチーム、チームはまた、クールダウン属性記録方法を研究し、そのとき彼は$ n $という番号を得ました。
WerKeyTom_FTD次のカードはどのように苦しんで一定でした。彼は突然SmallBellは疑問を提起した:私は、XORのJ $の$(私はNEQ jを\)$、最初の$ I、Jの$数アップ、最初の$ k個の$大XOR値を見つける$二つの数字を選択しますそれはあります。注意:$(i、j)の$と$(j、i)に対して$異なるスキームです。
SmallBell:良い水は、ああ、カットしています!そして、あなたに質問です。
データ範囲
$ K $のすべての数に加えて、より$ 5 \回10 ^ $ 4の正の整数であり、$ 1 \ルK \ルN \倍(N-1)$ありません
問題の解決策
$ $トライ木は半分答えを取って、確立した後、$ K $を$≥mid$ $ $トライ木の数の各排他的論理和値の数、そして審査員の合計を見つけ、効率ます。$ O(nlog ^ 2N)$
コード
#include <ビット/ STDC ++ Hが> の#define LL長い長い 使用して 名前空間STDを、 CONSTの INT N = 5E4 + 5 。 int型 N、[N]、L、R =(1 << 16) - 1、D、T = 1 。 LL kを、 構造体O { INT CH [ 2 ]、SZ。 } TR [N * 50 ]。 ボイドイン(INT X){ int型の P = 1 。 用(int型 V、iが= 15 ;〜I; i-- ){ V=(X >> I)&1 。 もし(!TR [P] [V] .CH) TR [P]が[V] .CH = ++ トンを。 P = TR [P] .CH [V]、TR [P] .sz ++ 。 } } int型 のget(INT X){ int型、P = 1、和= 0 。 用(int型 V、I = 15 ;〜I; i-- ){ V =(X >> I)&1 。 もし(D&(1 << I)) P = TR [P] .CH [V ^ 1 ]。 他 和 + = TR [TR [P] .CH [V ^ 1 ] SZ、 P = T R [P] .CH [V]。 } 戻り値の和+ TR [P] .sz。 } BOOL J(){ LL和 = 0 。 以下のために(int型 i = 1 ; iは++; iが= N < ) の和 + = 1LL * 得る([I])。 リターン(和> = K)。 } int型のmain(){ scanf関数(" %d個の%のLLD "、&N&K)。 以下のための(int型 I = 1;私は++; iが<= N ) のscanf(" %dの"、&[i])と、イン([I])を、 一方、(L < R){ dは =(L + R + 1)>> 1 。 もし(J())L = D。 他に、R = D- 1 。 } 戻りのprintf(" %d個の\ n "、L)、0 。 }