Official
C - 1D puyopuyo Editorial
by
C - 1D puyopuyo Editorial
by
sounansya
まず、最終的な \(|A|\) の値は操作の順番によって変わりません。したがって、可能な操作が複数ある場合は前から順番に消していくように制限して実際に操作をシミュレーションすることを考えます。
この操作を愚直に行うと最悪計算量が \(O(N^2)\) となり TLE (実行時間制限超過) となります。このシミュレーションを高速に行うことを考えます。
ここで使えるデータ構造が スタック と呼ばれるものになります。スタックを用いると、シミュレーションは以下のように行うことができます:
- スタック \(Q\) を用意する。
- \(i=1,2,\ldots,N\) に対して以下の操作を行う。
- \(Q\) の末尾に \(A_i\) を追加する。
- \(Q\) の末尾 \(4\) つが全て同じ要素である場合、\(Q\) の末尾から要素を削除する操作を \(4\) 回行う。
- 上の操作を全て行なった後の \(Q\) に入っている要素数が求める答えである。
スタックの末尾への追加・削除は \(O(1)\) 時間で行うことができるので、全体として \(O(N)\) 時間でこの問題を解くことができます。
以上を適切に実装することでこの問題に正答することができます。
n = int(input())
q = []
for v in list(map(int, input().split())):
q.append(v)
if len(q) >= 4 and q[-1] == q[-2] == q[-3] == q[-4]:
for i in range(4):
q.pop()
print(len(q))
posted:
last update:
