1540(セグメントツリー、間隔合併) - トンネル戦HDU

質問の意味:nはそこの家、最初で最後に破壊された家屋を再建するために、私は数字の家を破壊することができ、m個の操作がある、無傷で、私は家と直接または間接的に接続されているいくつかの家の数を照会することができます。

溶液:2仮説1 3 4 5 6 7 8 3及び7が破壊されており、今5を照会し、それが1--5最も右3,5の破壊された- 8左端が破壊が7です、最寄りの各ノードを維持する必要性は二つの点については、それを破壊するので、その破壊しただけのクエリは、ない--1をすれば答えは、もちろん、7--3--1 = 3であります

 

#include <cstdioを> 
する#include <iostreamの> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath> 
の#include <スタック> 
の#include <cstdlib> 
の#include <キュー> 
の#include < セット > 
の#include <ベクトル> 使用して名前空間はstdを、
#define INF 0x3f3f3f3f
 の#defineのEPS 1E-10 
のtypedef 長いLL。
const int型 MAXN = 5E4 + 5 const int型のmod = 998244353 ;

    

int型 STL [MAXN << 2 ]、STR [MAXN << 2 ]。
int型のn; 

ボイド押し上げ(INT O){ 
    STL [O] = MAX([<< O STL 1、STL] [O << 1 | 1 ])。
    STR [O] =分(STR [<< O 1、STR] [O << 1 | 1 ])。
} 
ボイドビルド(int型、O INTの L、INT R){
     場合(L == R){ 
        STL [O] = 0 ; 
        STR [O] = N +。1 ; 
    } {
         int型 MID =(L + R&LT)>> 1を
        ビルド(O << 1 、L、MID); 
        ビルド(O << 1 | 1、MID + 。1 、R&LT); 
        押し上げ(O)
    } 
} 
ボイド更新(INT O、INT L、INT R&LT、int型の POS、int型の ID){ // IDが損傷又は修復を決定するために使用される
    IF(L == R&LT){
         IF (ID)
        { 
            STL [O]= MAX(STL [O]、ID)。
            STR [O] = 分(STR [O]、ID)。
        } 
        { 
            STL [O] = 0 ; 
            STR [O] = N + 1 
        } 
    } {
         int型ミッド=(L + R)>> 1 もし(POS <= MID)更新(O << 1 、L、中間、POS、ID)。
        他の更新(O << 1 | 1、ミッド+ 1 、R、POS、ID); 
        突き上げ(O)
    } 
} 
int型 query_r(INT、O INTの L、INT R、INT QL、INT QR){
     場合(QL <= L && R <= QR)戻りSTR [O]。
    INT半ば=(L + R)>> 1 INT ANS = N + 1 もし(QL <= MID)ANS =分(ANS、query_r(O << 1 、L、中間、QL、QR))。
    もし(QR> MID)ANS =分(ANS、query_r(O << 1 | 1、中間+ 1 、R、QL、QR))。
    戻るANSを。
} 
INT query_l(INT O、int型の L、INT R、INT QL、INT QR){
     場合(QL <= L && R <= QR)戻りSTL [O]。
    INT半ば=(L + R)>> 1 int型 ANS = 0 ;
    もし(QL <= MID)ANS = MAX(ANS、query_l(O << 1 、L、中間、QL、QR))。
    もし(QR>中旬)ANS = MAX(ANS、query_l(O << 1 | 1、ミッド+ 1 、R、QL、QR));
    戻るANSを。
} 

int型のmain(){
     int型M。
    しばらく(〜のscanf(" %d個の%d個"、&​​N、&M)){ 
        (ビルド11 )N、。
        チャー S [ 5 ]。
        int型のC; 
        スタック < 整数 > STA;
        一方、(M-- ){ 
            scanf関数(" %sの" 、S);
            もし(S [ 0 ] == ' D ' ){ 
                scanf関数(" %のD "、&C)。
                アップデート(11、N、C、C)。
                sta.push(C); 
            } 
            そう であれば(S [ 0 ] == ' R ' ){ 
                C = sta.top()。
                sta.pop(); 
                アップデート(11、N、C、0 ); 
            } 
            { 
                scanf関数(" %のD "、&C)。
                INT ANS = query_r(11、N、C、N) - query_l(11、nは、1、C) - 1 //のprintf( "%d個の%のD"、query_r(1,1、N、C、N)、query_l(1,1、nは、1、C))。

                printf(" %d個の\ n "、MAX(0 、ANS))。
            } 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/smallhester/p/11330158.html