【CF1198B】福祉国家

質問は、説明に直面します。

N- $ A_1、A_2、...、A_N $の$ $ A与えられた数と$ M $操作は、操作は、2つのタイプに分けられます:

①の$ P、Xの$、$ A_P $ $ X $に変更最初に与えられ、

②は、$ xに$を与え全体のシーケンス番号は$ xに$ X $未満で置き換えます。$

最後に、すべての数字の値を見つけます。

$ 1 \ K、M、\ 2 * 10 ^ 5 0 \ X、a_iを\ 10 ^ 9 $

解決

話題の分析は、いくつかのプロパティを見つけることができます:

  • 最後にのみ変更され、単一の点で記録する必要があります
  • 場合は、一点の最後のいくつかの変更、答えはのみによって変更間隔に影響を与えます

したがって、我々は、配列$ bは$の記録を使用し、B_i $ $ I $ $は、いくつかの操作されている最後の変更(シングルポイント)の数を表します。

$ A $配列は、単一の変更が効率に影響を与えません行うので、私たちは、配列$ A $の上で直接、単一のポイントを交換するの値を変更しているため。

さらに、我々は配列の$ C $を使用し、目の$ C_I $ $ I $、レコードの$ mの$は最大時間間隔の動作を変更します。

なぜ我々はそれを行う必要がありますか?

我々は配列$ B $を定義する前に、次に$ C_ {b_i} $は、得られた回答を修正する単一のポイントに加えてあります。

回答数の出力は$私は$ $ \最大である(a_iを、C_ {b_i})$

変数を入手する方法

配列$ A $:のみ$ O(n)と$ので、単一の変更をサポートしています。

配列$ Bは$:各ポイント動作について、再び最後の現在の点が発生するので、再帰を更新する必要があり、複雑さの$ O(N)$。

その後、第一の記憶部レコードの変更操作、および接尾辞再帰的な複雑さの$ O(n)の$に答える:配列$ Cの$。

参照コード

上にある//配列A、Bのアレイ即ちL、すなわちアレイB、C 

の#include <cstdioを> インラインINT 読む(){ int型 NUM = 0、B = 1。; CHAR C = GETCHAR(); 一方、(C < ' 0 ' || C> ' 9 ' ){ IF(C == ' - ')B = - 1。; C = GETCHAR(); } 一方、(C> = ' 0 ' && C <= ' 9 '){ A= NUM * 10 + C - ' 0 ' C = GETCHAR()。 } 戻り NUMの*のB。 } int型、N [ 200010 ]、L [ 200010 ]、Q、選ぶ、X、Y。 int型 B [ 200010 ]。 インラインint型の最大値(int型int型B){ 返す > bは?A:B; } int型のmain(){ N = )(読み取ります。 int型 iは= 1、I ++; iが<= N。 [I] = (読み取り) Q = 読み取り(); 以下のためにint型 I = 1 ; I <= Q; iは++ ){ OPT = リード()。 場合(OPTの== 1 ){ Xの =は、read()は、Yは、= )(読み取ります。 [X] = yと、 L [X] = I。 } { X = リード()。 B [i]は =のX。 } } のためのINTI = Q- 1I> = 0 ; i-- B [I] = MAX(B [I]、B [I + 1 ])。 以下のためにint型 i = 1 ; iが<= N; iは++ のprintf(" %dの" 、MAX([I]、B [Lを[I]))。 リターン 0 ; }

 

おすすめ

転載: www.cnblogs.com/zengpeichen/p/11494596.html