1754(セグメントツリーの最大範囲を見つけるために) - 私はHDUはそれを嫌います

私はそれを嫌う1754 - HDU

トピックへのリンク:https://vjudge.net/problem/HDU-1754

トピック:

多くの学校のより人気の習慣。先生は本当に最高のスコアの中からあるので、そのためにとてもので、お願いしたいです。
これは、多くの学生はうんざりしていることができます。

あなたがそれを好きかどうか、今あなたがする必要があるかどうかは、それが尋ねた先生をシミュレートするプログラムを書くために、教師の要件に準拠している、です。もちろん、教師は時々 、特定の生徒の成果を更新する必要があります。

入力は、このタイトルは、ファイルの末尾に対処するために、テストの複数のセットを持っています。
各テストの最初の行では、2つの正の整数N及びM(0 <N <= 200000,0ある <M <5000)は、 操作の数と学生の数を表します。
学生のID番号は、1からNにコンパイルされています
2行目は、i番目の生徒IDが結果、iの代表であるN初期学生の成績を表す、N個の整数を含みます。
次のM行。各行は、文字Cを持っており、2つの正の整数A、B。(単に「Q」または「U」を取ります)
Cは、これが照会操作であることを「Q」の時間である場合、それは学生の間(A、Bを含む)BからIDを照会し、最高のスコアです。
Cは、これが更新動作であることを「U」の時間である場合、IDは、グレードに学生Bを変更する必要
行の最も高いスコアを出力する各クエリ動作のための出力。サンプル入力
5 6 
1 2 3 4 5 
Q 1 5 
U 3 6 
Q 3 4 
Q 4 
U 2~9 
Q 1 5
サンプル出力
5つの
6 
5 
9 アイデア:単一のポイントを修正するための簡単な工夫ツリーラインは、最大を交換する最大の和を求めますが、更新はまだステップのアップデートにより左右のノードノードのステップを押してください



//  
// 2019年9月4日にHJYLによって作成されます。
//
する#include <アルゴリズム> 
書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <キュー> 
の#include < 設定 > 
書式#include <math.h>の
書式#include <マップ>
 使用して 名前空間はstd;
const  int型 MAXN = 1E6 + 7 INTの入力[MAXN]。

構造体ノード{
     INT 左;
    int型、右;
    int型MAXX。
}ツリー[MAXN * 4]; 

ボイド押し上げ(INTのルート)
{ 
    ツリー[ルート] .maxx = MAX(ツリー[ルート<< 1 ] .maxx、ツリー[ルート<< 1 | 1 ] .maxx)。
} 

ボイドビルド(int型のルート、int型の L、INT R)
{ 
    ツリー[ルート] .LEFT = L。
    ツリー[ルート] .RIGHT = R。
    もし(L == R)
    { 
        ツリー[ルート] .maxx = 入力[L]。
        返します
    } 
    INT半ば=(L + R)>> 1  
    ビルド(ルート << 1 、L、ミッド)。
    構築(ルート << 1 | 1、ミッド+ 1 、R); 
    突き上げ(ルート)。
} 
int型maxxx。
空隙変化(int型の根、INT DIS、int型K)
{ 
    場合(ツリー[ルート] .LEFT == ツリー[ルート] .RIGHT)
    { 
        ツリー[ルート] .maxx = K。
        返します
    } 
    もし(ツリー[ルート<< 1 ] .RIGHT> = DIS)
        変化(根 << 1 、DIS、K)。
    それ以外の
        変更(ルート << 1 | 1 、DIS、K); 
    突き上げ(ルート)。
} 

int型の検索(INTのルート、int型の L、int型R)
{ 
    int型 maxxx = 0 場合(L <=ツリー[ルート] .LEFT &&ツリー[ルート] .RIGHT <= R)
    { 
        戻りツリー[ルート] .maxx。
    } 
    場合(L <=ツリー[ルート<< 1 ] .RIGHT)
        maxxx = MAX(maxxx、検索(根<< 1 、L、R))。
    もし(R> =ツリー[ルート<< 1 | 1 ] .LEFT) 
        maxxx= MAX(maxxx、検索(ルート<< 1 | 1 、L、R))。
    リターンmaxxx。
} 

int型のmain()
{ 
    int型、N M。
    一方、(〜のscanf(" %D%dの"、&​​N、&M)){
         ためint型 i = 1 ; iが<= N iが++ 
            のscanf(" %dの"、および入力[I])。
        ビルド(11 、N)
        チャー CH [ 10 ]。
        // COUT << "M =" << M << ENDL。
        一方、(M-- ){ 
            scanf関数(" %sの" 、CH)。
            // getchar関数(); 
            もし(CH [ 0 ] == ' Q ' ){
                 int型LL、RR。
                // coutの<< "HHH" <<てendl; 
                scanf関数(" %dの%のD "、&​​LL&RR)。
                printf(" %d個の\ n "、検索(1 、LL、RR))。
            } {
                 int型のP、Q。"、&​​P&Q); 
                変化(1 、P、Q); 
            } 
        } 
    } 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Vampire6/p/11462741.html