ポータル
これは典型的な単調なスタックです。
問題の意味を理解します
タイトルの意味を理解する最初の(オリジナルの翻訳は少し問題がありました)。
実際に私は、それの右側の桁数とcは私[I]の最初の数よりも大きい判定された各シーケンス番号に対して、求めています。そして、最終的に得られます。
まず、暴力を解決することができる、時間複雑度はO(n ^ 2)はっきりTLE。
そして、それは単調なスタックを行うことです。
単調なスタック
単調スタックは、スタックの要素は、(インクリメント/デクリメント)単調になるように、スタックを維持することです。
仮定が減少している - スタックの最上部に新たな各要素について、すべてこのデジタルポップのすべての要素よりも大きい場合、この最後の要素はリストに追加されます。
(スタックが空である場合、直接添加)
単調なスタックそれは何を使用ですか?
- スタックは、他の要素よりも、その左右両側よりも第1の小さなを取得する(n)の時間計算量O単調に増加するためです。
- このとき上部要素は、左の最初のものでなければならないときにプッシュ要素がスタックにプッシュすることができるスタック要素に最初の要素よりも小さくなっています。
- 要素が最初の最初の要素の右側を押す必要がある場合には、スタックからスタックの要素は、スタックの最上部よりも小さい場合。
- スタックが単調Oに減少している(n)の時間複雑さの要件は、左右の要素のそれより大きかったです。
- このとき上部要素は、左の最初のものでなければならないときにプッシュ要素がスタックにプッシュすることができるスタック要素に最初の要素よりも大きいです。
- 要素が最初の最初の要素の右側を押す必要がある場合にはスタックからスタックの要素は、スタックの最上部よりも大きい場合。
問題解決のためのアイデア
この質問は、最大の要素ので、とても単調スタックの減少に伴って必要とされます。
第一の方法は、最終的な差の和を、その要素よりも大きい場合、最初の右側が得られ、各要素のためのものです。
第二は、簡単であるが、各番号のスタックを入力しようとする方法を考えることは困難であることは、現時点では、スタック内の要素の数(要素がスタックにまだない)に連結されているANS。
なぜ?
スタック内のすべての要素については、この時点では、それは単調減少でなければならないので、これは、スタック内の要素を見ることができる要素をプッシュしようとしているので、スタックの答えの要素数を加えました。
注意事項
- 長い長いと、それ以外の場合は爆発します。
- タイトルを読んで、スタックの状態は=の代わりに<<であることに注意してください。
- whileループ&& s.size()条件が左側になければなりません。
ACコード
1の#include <iostreamの> 2の#include <積層> 3の#include <cstdioを> 4 使って 名前空間STDを、 5つの 長い 長いANS; 6スタック< int型 > S; 7 int型になりましN; 8 INT メイン(){ 9 CIN >> N。 10 のために(int型 I = 1 ; ++; iが<= N I) 11 { 12 のscanf(" %dの"、&今)。 13 しばらく(s.size()&& s.top()<= NOW)s.pop(); 14 ANS + = s.size()。 15 s.push(今)。 16 } 17 COUT << ANS。 18 リターン 0 。 19 }