私はそれを嫌う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])。 ビルド(1、1 、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 ; }