#3315。フルコンボ

タイトル説明

最近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型 のgetINT 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 
}

 

おすすめ

転載: www.cnblogs.com/xjqxjq/p/11327028.html