白駿#2493
白駿2493号:タワー
スタックに保持=受信不可
スタックからポップアップ=受信
要素を追加するたびにスタックのtopがチェックされます.
このとき、
スタックは空で、pop要素がなくなり、
実際、スタックを利用する考えはすぐに思い出して、どのように答えを保存してどのように出力するかで長い間うろうろしていました...
タワーのリストを巡回すると
まず[0]*nリストを発表し、タワー順に答えを保存すればいいと思っていました.しかしスタックの中でpopを見てみると答えが保存されるのではないでしょうか.今popの要素がtowersにどれだけインデックスがあるか分かりません.
そこで、インデックスを必要とせずに値を格納できるディックシリーズを思い浮かべました.タワーの高さが異なる条件が明確に定められているので、鍵としても問題ありません.
この方法には2つの問題がある.
私の知っている限りでは、ディックシリーズが出力時に保存された順序で出力される保証はありません.出力では、for文を回し、すべての値を文字列に接続する必要があります. 2番目の問題でタイムアウトに失敗したのかもしれません
高さをインデックスとして、その場所に答えを保存します.高さnのタワーの答えをlist[n]に保存します.
「塔の高さは1以上10000000以下の整数です.」
メモリオーバーフローに失敗しました
スタックに新しい要素を追加する要素をnextと呼びます.
スタックに後ろから順番に追加されるので、nextとスタックのtopは隣接するタワーのみです.(スタックtopは、新しい要素を追加する前にポップアップする機会がないため)、forクエリのidx(すなわち、スタックに追加する新しい要素のインデックス+1)によって、ポップアップ要素のインデックスを得ることができる.
上記のコードでは
popが複数回ある場合は、
タワーの高さではなくスタックにインデックスを追加することもできます.
タワーの配列は変更されず、インデックスはO(1)であるため、比較するたびにスタック内のインデックスを使用してタワーの高さをクエリーできます.
🦊 マイコード
from collections import deque as dq
import sys
n = int(sys.stdin.readline())
towers = [int(i) for i in sys.stdin.readline().split()]
ans = [0]*n
stack = dq()
for idx in range(-1, -(n+1), -1):
next = towers[idx]
if len(stack) == 0:
stack.append(next)
continue
else:
last = stack[-1]
if last>next:
stack.append(next)
continue
else:
poppedIdx = (idx+1)+n
while len(stack)>0:
last = stack[-1]
if last>next:
break
else:
if ans[poppedIdx]==0:
ans[poppedIdx] = idx+n+1
stack.pop()
poppedIdx +=1
stack.append(next)
print(*ans)
タワーリスト要素を後→前の順にスタックに追加スタックに保持=受信不可
スタックからポップアップ=受信
要素を追加するたびにスタックのtopがチェックされます.
このとき、
추가하는 요소
>스택 top
であれば、スタックtopをpop()とする.または、要素を直接追加して、次のインデックスに移動します.スタックは空で、pop要素がなくなり、
추가하는 요소
<스택 top
までpop()を続行します.すべてのpopが終了したら、要素を追加して次のインデックスに移動します.実際、スタックを利用する考えはすぐに思い出して、どのように答えを保存してどのように出力するかで長い間うろうろしていました...
🐹 1特:専制
タワーのリストを巡回すると
{<탑 번호>:0}
ディックシリーズが生成された.まず[0]*nリストを発表し、タワー順に答えを保存すればいいと思っていました.しかしスタックの中でpopを見てみると答えが保存されるのではないでしょうか.今popの要素がtowersにどれだけインデックスがあるか分かりません.
そこで、インデックスを必要とせずに値を格納できるディックシリーズを思い浮かべました.タワーの高さが異なる条件が明確に定められているので、鍵としても問題ありません.
この方法には2つの問題がある.
私の知っている限りでは、ディックシリーズが出力時に保存された順序で出力される保証はありません.
🐻 2 t:[0]*max(タワー高さ)アレイ
高さをインデックスとして、その場所に答えを保存します.高さnのタワーの答えをlist[n]に保存します.
「塔の高さは1以上10000000以下の整数です.」
メモリオーバーフローに失敗しました
🐭 3点:idxで連絡
スタックに新しい要素を追加する要素をnextと呼びます.
スタックに後ろから順番に追加されるので、nextとスタックのtopは隣接するタワーのみです.(スタックtopは、新しい要素を追加する前にポップアップする機会がないため)、forクエリのidx(すなわち、スタックに追加する新しい要素のインデックス+1)によって、ポップアップ要素のインデックスを得ることができる.
上記のコードでは
poppedIdx = (idx+1)+n
としています.popが複数回ある場合は、
poppedIdx
の更新に注意してください.poppedIdx
をほぼ1増やし、nextの右側のタワーを確認します.それらのタワーがスタックにあるかどうかは、ansリストを見ればわかります.ans[popedIdx]が0であることは、タワーがスタック内にあることを示すため、pop()はans[poppedIdx]==0
の場合のみである.🐻❄️ 4 t:最初からスタックにインデックスを追加
タワーの高さではなくスタックにインデックスを追加することもできます.
タワーの配列は変更されず、インデックスはO(1)であるため、比較するたびにスタック内のインデックスを使用してタワーの高さをクエリーできます.
Reference
この問題について(白駿#2493), 我々は、より多くの情報をここで見つけました https://velog.io/@eunddodi/2svzek70テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol