バランスLineup--区間最大値、最小間隔

トピックリンク

質問の意味:

所定数N、q回の問合せ、現在の最大値と最小値との間の問い合わせ間隔の差

ソリューション:

セグメントツリーのテンプレートのタイトル

範囲は最大値、最小値を照会します

コード:

#include <iostreamの> 
する#include <stdio.hに> 
する#include <math.h>の
書式#include <アルゴリズム> 
の#include <ベクトル> 
の#include <地図>
 使用して 名前空間STD。
typedefの長い 長いLL。
const  int型 MAXN = 1E5 + 5 構造体ノード
{ 
    int型のL、R。
    int型ミネソタ州、MAXX。
}ツリー[MAXN << 2 ]。
int型のn、[MAXN]、Q。
ボイド push_up(INT X)
{ 
    ツリー[X] .maxx = MAX(ツリー[X <<1 ] .maxx、ツリー[X << 1 | 1 ] .maxx)。
    ツリー[X] .minn =分(ツリー[X << 1 ] .minn、ツリー[X << 1 | 1 ] .minn)。
} 
ボイドビルド(int型のx、int型の L、INT R)
{ 
    ツリー[X] .L = L、木[X] .R = R。
    もし(L == R)
    { 
        ツリー[X] .maxx =ツリー[X] .minn = A [L]。
    } 
    
    { 
        int型ミッド=(L + R)>> 1 
        ビルド(X << 1 、L、MID)。 
        ビルド(X<< 1 | 1、中間+ 1 、R)。
        push_up(X)。
    } 
} 
LLクエリ(int型のx、int型の L、int型の R、int型のフラグ)
{ 
    int型 L =ツリー[X] .L、R = ツリー[X] .R。

    もし(L <= L && R <= R)
    { 
        場合(フラグ)戻りツリー[X] .maxx。
        他の リターンツリー[X] .minn。
    } 
    
    { 

        場合(フラグ)
        { 
            LL ANS = 0int型;
            半ば=(L + R)>> 1 もし(MID> = 1)ANS = MAX(ANS、クエリ(X << 1 、L、R、フラグ))。
            もし(MID <R)ANS = MAX(ANS、クエリ(X << 1 | 1 、L、R、フラグ))。
            push_up(X)。
            戻るANSを。
        } 
        
        { 
            LL ANS = 0x3f3f3f3f INT半ば=(L + R)>> 1 もし(MID> = 1)ANS =分(ANS、クエリ(X << 1 、L、R、フラグ))。
            もし(MID <R)ANS =分(ANS、クエリ(X << 1 | 1、L、R、フラグ))。
            push_up(X)。
            戻るANSを。
        } 

    } 

} 
int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N、&Q)。
    以下のためにint型私= 1 ; iが<= N; iが++ 
        のscanf(" %dの"、および[I])。
    ビルド(11 、N)
    以下のためにint型 I = 1 ; I <= Q; iは++ 
    { 
        int型のL、R。
        scanf関数(" %dの%のD "、&​​L、&R); 
        LL ANS =クエリ(1、L、R、1)-query(1、L、R、0 ); 
        printf(" %LLDする\ n " 、ANS)。
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/j666/p/11619801.html