UOJ#169] [UR#11元旦と高齢者のセグメントツリー・ビートの列数

この質問はいい迷惑です。   

次の最小値及び長い時間の最小値、WAで更新。           

この質問は、潜在的なエネルギーの練習の分析に使用され、マーキングプロセスに質問することをCPUモニタを使用していませんでした。 

ツリーラインのこれらのタイプの類似点と相違点を見て時間を持っています。 

コード:   

書式#include <cstdioを> 
する#include <アルゴリズム> 
書式#include <CStringの> 
の#include <cmath>      
に#define LL長い長い
の#define N 500006      
の#define LSON X << 1 
の#define rsonのx << 1 | 1    
の#define INF 0x3f3f3f3f      
# I(S)freopenは(S ".IN"、 "R"、STDIN)を定義する
の#define O(S)freopenは(S "の.out"を"W"、STDOUT)
の#define setIO(S)I(S) O(S)   
名前空間stdを使用。
int型NMIN [N << 2]、PMIN [N << 2]、SE [N << 2]。   
INT ptag_a [N << 2]、ntag_a [N << 2]、ptag_b [N << 2]、ntag_b [N << 2]。                    
ボイド押し上げ(INT X)
{ 
    NMIN [X] =分(NMIN [LSON]、NMIN [rson])。   
    IF(NMIN [rson <NMIN [LSON税])[X] =分(SE [rson]、NMIN [LSON])。  
    IF(NMIN [LSON] == NMIN [rson税])[X] =分(SE [LSON税]、[rson])。   
}    
// V1表示历史最小                 
空隙mark_a(int型のx、int型V1、V2 INT)
{                
    PMIN [X] =分(PMIN [x]は、NMIN [X] + V1)。        
    [X] =分(ptag_a [X]、ntag_a [X] + V1)ptag_a。     
    NMIN [X] + = V2、ntag_a [X] + = V2。                       
} 
ボイドmark_b(int型のx、int型V1、V2 INT)
{ 
    ptag_b [X] =分(ptag_b [X]、ntag_b [X] + V1)。   
    ntag_b [X] + = V2。    
    (もし!SE [X] =税INF)[X] + = V2。
} 
ボイドプッシュダウン(INT X) 
{     
    INT C =分(NMIN [LSON]、NMIN [rson])。     
    IF(NMIN [LSON] == C)
    { 
        mark_a(LSON、ptag_a [X]、ntag_a [X])。       
        mark_b(LSON、ptag_b [X]、ntag_b [X])。  
    }    
    エルス
    { 
        mark_a(LSON、ptag_b [X]、ntag_b [X])。      
        mark_b(LSON、ptag_b [X]、ntag_b [X])。   
    }     
    IF(NMIN [rson] == C)
    { 
        mark_a(rson、ptag_a [X]、ntag_a [X])。       
        mark_b(rson、ptag_b [X]、ntag_b [X])。  
    }    
    エルス
    { 
        mark_a(rson、ptag_b [X]、ntag_b [X])。      
        mark_b(rson、ptag_b [X]、ntag_b [X])。   
    }            
    ptag_a [X] = ntag_a [X] = ptag_b [X] = ntag_b [X] = 0;    
}                   
ボイドADDV(int型L、INT R、int型のx、int型L、RのINT、INT V)
{
    場合(L> = L && R <= R)
    { 
        mark_a(X、V、V)、mark_b(X、V、V)。   
        リターン; 
    } 
    プッシュダウン(X)。
    INTミッド=(L + R)>> 1。      
    IF(L <= MID)ADDV(L、中間、LSON、L、R、V)。
    IF(R> MID)ADDV(MID + 1、R、rson、L、R、V)。     
    突き上げ(X)。
} 
ボイドgetmax(int型L、INT R、int型のx、int型L、INT R、int型V)
{    
    IF(NMIN [X]> = V)リターン;   
    IF(L> = L && R <= R && SE [X]> V)   
    {    
        mark_a(X、V-NMIN [x]は、V-NMIN [X])。       
        リターン; 
    } 
    プッシュダウン(X)。
    IF(L <= MID)getmax(L、中間、LSON、L、R、V)。
    IF(R> MID)getmax(MID + 1、R、rson、L、R、V)。     
    突き上げ(X)。
} 
INT queryn(INT L、INT R、int型のx、int型のL、R INT)
{ 
    IF(L> = L && R <= R)戻りNMIN [X]。    
    プッシュダウン(X)。
    INTミッド=(L + R)>> 1。    
    IF(L <=ミッド&& R> MID)リターン分(queryn(L、中間、LSON、L、R)、queryn(MID + 1、R、rson、L、R));  
    他の場合(L <= MID)戻りqueryn(L、中間、LSON、L、R)。  
    他戻りqueryn(MID + 1、R、rson、L、R)。    
} 
INT queryp(INT L、INT R、int型のx、int型のL、R INT)
{ 
    IF(L> = L && R <= R)戻りPMIN [X]。    
    プッシュダウン(X)。
    INTミッド=(L + R)>> 1。    
    IF(L <=ミッド&& R> MID)リターン分(queryp(L、中間、LSON、L、R)、queryp(MID + 1、R、rson、  
    他の場合(L <= MID)戻りqueryp(L、中間、LSON、L、R)。  
    他戻りqueryp(MID + 1、R、rson、L、R)。    
        もし(OP == 1)のscanf( "%d個"、&   
{ 
    (L == R)なら
    、{ 
        scanf関数( "%d個"、&NMIN [X])、PMIN [X] = NMIN [X]、SE [X] = INF。
        リターン;    
    }    
    int型のミッド=(L + R)>> 1。    
    ビルド(L、中間、LSON)、ビルド(MID + 1、R、rson)。   
    突き上げ(X)。  
} 
int型のmain()
{ 
    // setIO( "入力")。
    整数N、M。   
    scanf関数( "%D%D"、&N、&M)、ビルド(1、nは、1)。  
    以下のために(INT I 1 =; I <= M; ++ I)
    { 
        int型のOP、L、R、Z。  
        scanf関数( "%D%D%D"、&OP、&L&R)。
        IF(OP == 2)のscanf( "%d個"、&Z)、getmax(1、nは、1、L、R、Z)。   
        IF(OP == 3)のprintf( "%dの\ n"は、queryn(1、nは、1、L、R))。
    }         
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/12563582.html