会長羅区p3834ツリー

トピックリンクします。https://www.luogu.org/problem/P3834

木の会長は、まだkの小さなセクションを求めて

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <アルゴリズム>
 使用して 名前空間はstdを、
#define MAXN 200005
 の#defineっ長い長い
 INT T [MAXN * 20 ]、L [MAXN * 20 ]、R [MAXN * 20 ]、和[MAXN * 20 ]、TOT。
LL [MAXN]、B [MAXN]。
インラインINTの更新(INTプリ、int型の L、int型の R、INT X)
{ 
    int型 RT = ++ TOT。
    L [RT] = L [事前]。
    R [RT] = R [事前]と、
    和[RT] =和[事前] + 1 もし(L < R)
    { 
        int型ミッド= L + R >> 1 もし(x <= MID)L [RT] = アップデート(L [事前]、L、中、X)。
         R [RT] =アップデート(R [事前]、ミッド+ 1 、R、X)。
    } 
    戻りRT; 
} 
インラインINTクエリ(INT U、INT V、INTを L、int型の R、int型K)
{ 
    場合(L> = R)戻りL。
    INT X =和[L [V]] -和[L [U]、ミッド= L + R >> 1;
    もし(x> = k)の戻りクエリ(L [U]、L [V]、L、中、K)。
     戻りクエリ(R [U]、R [V]、ミッド+ 1、R、K- X)。
} 
int型のmain()
{ 
    int型、N M。
    scanf関数(" %d個の%のD "、&​​N、&M)。
    以下のためにint型 i = 1 ; iが<= N; iが++ 
    { 
        scanf関数(" %のLLDを"[I])。
        B [i]は = [I]。
    } 
    ソート(B + 1、B + 1 +N);
    INT LEN =一意(B + 1、B + 1 + N)-B- 1 
    TOT = 0 ;
    以下のためにint型 i = 1 ; iが<= N; iは++ 
    { 
        int型の POS = LOWER_BOUND(B + 1、B + 1 + LEN、[I]) - B。
        T [I] =アップデート(T [I- 1 ]、1 、LEN、POS)。
    } 
    int型のL、R、K。
    以下のためにint型 I = 1 ; I <= M iは++ 
    { 
        scanf関数(" %D%D%D"&L&R& K); 
        のprintf(" %LLDする\ n "、B [クエリ(T 1- [ 1 ]、T [R]、1 、LEN、K)]); 
    } 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/chen99/p/11294035.html