レース思考や感情は非常に明確で、ああではありません。この最初の質問の場合は、ポイントレースがミスを犯し、問題のためのアルゴリズムを推測1個の偽のは、CF質問の前にあってもよいことは比較的簡単ですが、結論を推測する習慣を開発することは容易であるが、このタイトルはまた、偽の結論を推測する最初のものですその後、私は非常に次の努力に影響を与えると感じたら、第二は、問題の考えのために、私は常に反復解法であると考えられてきているが、私は最終的に私が運転から出てくるために行う必要があり、カードを持ってきた時間半のWAを書きました彼は実際には、書き込みを続行する必要はありません、住んでいた、と後のゴミの時間は、実際には、他のアイデアを考える、タイムリーに発売されるべきだと思います。
最初にこの問題の主なアイデアで、我々はシミュレーションを試みたが、あなたは答えを見つける前に一度、一度答えは、すぐに転写することが困難になった後、爆弾の添加のみであるが、しかし、その後の影響が何であるかを保証することはできませんそれを上に考えた後、反復はあきらめて、正しく質問について考える必要があります。退行答えの違いは、答えはO(N)一般的であるため、この問題の主なアイデアは、あなたが、あなたはすぐにこのことの実現可能性を判断することができれば、現在の答えは、Xに思われるチェックされなければならないです問題の複雑さが降りてきます。
答えは、Xかもしれかどうかを確認する方法、xはあなたがxより数の大きいがあるでしょうのための答えは、爆破されなければならないと思うだろうよりも大きい場合、パターンがあります:
彼は右から最初にチェックすることである場合はxよりも大きい場合、それは少なくとも一つの爆弾の権利を有します。
彼は右から2番目がxよりも大きいことをチェックしている場合、それは、少なくとも二つの爆弾の権利を有します。
彼は右からチェックよりも第三大きい場合、それは少なくとも3つの爆弾の権利を有します。
あなたがしなければならないすべては、条件が満たされているかどうかを確認することで、そのようなことがあります。しかし、あなたは反復的である、それは実際に反復は、X実現可能なため宣告され、x-1を宣告することができることを見つけます。X X-1は、それがデジタルX-1と爆弾それよりもはるかに大きい場合は、センテンスからセンテンスに、位置がわかります。
うまく、0以上である、あなたが必要な答えマイナス1、およびタイムゾーンの更新 - 私たちは(右の爆弾の数xは、現在の番号の右側よりも大きい場合)、各メモリ位置をセグメントツリーを開けません。
書式#include <iostreamの> の#include < 文字列 > の#include < 文字列の.h> の#define LSON RT << 1 の#define rson RT << 1つの| 1つの 使用して 名前空間はstd; typedefの長い 長いLL。 ペアのtypedef < int型、int型 > P; const int型 MAXN = 3E5 + 10 。 INTツリー[MAXN << 2 ]、怠惰[MAXN << 2 ]、[MAXN]、P [MAXN]、トング[MAXN]。 ボイドプッシュダウン(INT RT) { ツリー[LSON]+ = 怠惰[RT]。 ツリー[rson] + = 怠惰[RT]。 怠惰[LSON] + = 怠惰[RT]。 怠惰[rson] + = 怠惰[RT]。 怠惰[RT] = 0 ; } ボイド押し上げ(INT RT) { ツリー[RT] = MAX(ツリー[LSON]、ツリー[rson])。 } ボイド更新(int型 L、INT R、int型のx、int型 L、INT R、int型RT) { 場合(L <= L && R <= R) { ツリー[RT] + =バツ; 怠惰[RT] + = X。 リターン; } プッシュダウン(RT)。 INT半ば=(L + R)/ 2 。 もし(L <= MID) 更新(L、R、X、L、中間、LSON)。 もし(MID < R) 更新(L、R、X、中間 + 1 、R、rson)。 突き上げ(RT)。 } int型 Q(int型 L、INT R、INT L、int型の R、INT RT) { プッシュダウン(RT)。 もし(L <= L && R <= R) { リターンツリー[RT]。 } INT半ば=(L + R)/ 2 。 int型 ANS = 0 ; もし(L <= MID) ANS = MAX(ANS、Q(L、R、L、中間、LSON))。 もし(MID < R) ANS = MAX(ANS、Q(L、R、中間+ 1 、R、rson))。 戻り値は、ANS; } インラインINT lowbit(INT X){ 戻り X&( - X)。 } INT N; int型のmain() { CINを >> N。 以下のための(INT iは= 1 ; iが<= N; I ++ ){ CIN >> [I]。 トング[I] = I。 } ため(INT iは= 1 ; I <= N; I ++ ) CIN >> P [i]は、 int型になりました= N; アップデート(1、トング[n]は、1、1、nは、1 )。 以下のために(INT iが= 1 ; I <= N; I ++ ) { COUT <<今<< " " 。 もし(I == n)を ブレーク。 アップデート(1、P [i]は、 - 1、1、nは、1 )。 一方、(Q(1、nは、1、nは、1)<= 0 ) { 今 - 。 アップデート(1、[今]、トング1、1、nは、1 )。 } } }