提出 #59704261


ソースコード 拡げる

"""
<方針>
- シミュレーションはしない.
- 木を収穫するのは最後に回す.
- いもす法を使って,木の高さを構築する.
- 後回しにした分,収穫したかった木の高さ `H` を経過した `T` だけ増やせば問題無い(未来に植えた木は切れないのでOK).
- 木の高さが降順なので,二分探索をする.
- 既に収穫した木は,新しく収穫できないことに注意する.
"""

Q = int(input())

# 木を収穫するとき状況を保存するリスト
whenT = []
# 植物の高さを管理するリスト
plant = []
# 収穫したい木の高さのリスト
H = []

# 入力
for _ in range(Q):
  query = list(map(int, input().split()))
  match query:
    case [1]:
      # シミュレーションは後回し.木を植えるだけ.
      plant.append(0)
    case [2, t]:
      # [経過させたい日数, 現在の植木鉢の数(収穫は想定しない), 既に収穫したい回数]
      whenT.append([t, len(plant), len(H)])
    case [3, h]:
      # 収穫したい木の高さ
      H.append(h)

# いもす法のための番兵
plant.append(0)
# いもす法のための番兵
H.append(0)

# Hのいもす法は別リストを作成する必要がある.
accH = [0]*len(H)
# いもす法のフラグを埋め込む
for t, p, h in whenT:
  # 植物
  plant[0] += t
  plant[p] -= t
  
  # 収穫
  accH[0] += t
  accH[h] -= t

# いもす法の累積和
for i in range(len(plant)-1):
  plant[i+1] += plant[i]
  
# いもす法の累積和
for i in range(len(H)-1):
  accH[i+1] += accH[i]

# いもす法をした内容を元の収穫したい木の高さに加える.
for i in range(len(H)):
  H[i] += accH[i]

# 既に収穫した木の最大index
cut = -1
# 収穫を行う
for h in H[:-1]:
  # めぐる式二分探索
  ok = -1
  ng = len(plant)
  while abs(ok-ng)>1:
    mid = (ok+ng)//2
    if plant[mid] >= h:
      ok = mid
    else:
      ng = mid
  
  # 収穫した木の本数を出力
  print(max(ok-cut, 0))
  
  # 収穫した木の最大indexを更新
  cut = max(cut, ok)

提出情報

提出日時
問題 D - Home Garden
ユーザ mattsunkun
言語 Python (PyPy 3.10-v7.3.12)
得点 400
コード長 2176 Byte
結果 AC
実行時間 190 ms
メモリ 109132 KiB

ジャッジ結果

セット名 Sample All After Contest
得点 / 配点 0 / 0 400 / 400 0 / 0
結果
AC × 2
AC × 30
AC × 1
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 02_hand_00.txt, 02_hand_01.txt, 02_hand_02.txt
After Contest 03_after_contest_00.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 64 ms 76284 KiB
00_sample_01.txt AC 64 ms 76276 KiB
01_random_00.txt AC 154 ms 90164 KiB
01_random_01.txt AC 178 ms 95800 KiB
01_random_02.txt AC 165 ms 92688 KiB
01_random_03.txt AC 148 ms 89892 KiB
01_random_04.txt AC 118 ms 85808 KiB
01_random_05.txt AC 167 ms 93096 KiB
01_random_06.txt AC 114 ms 84944 KiB
01_random_07.txt AC 142 ms 89204 KiB
01_random_08.txt AC 113 ms 85200 KiB
01_random_09.txt AC 98 ms 83892 KiB
01_random_10.txt AC 138 ms 87976 KiB
01_random_11.txt AC 112 ms 84848 KiB
01_random_12.txt AC 174 ms 95760 KiB
01_random_13.txt AC 173 ms 94872 KiB
01_random_14.txt AC 120 ms 85588 KiB
01_random_15.txt AC 123 ms 86584 KiB
01_random_16.txt AC 114 ms 84816 KiB
01_random_17.txt AC 167 ms 92780 KiB
01_random_18.txt AC 130 ms 87372 KiB
01_random_19.txt AC 164 ms 93048 KiB
01_random_20.txt AC 174 ms 95120 KiB
01_random_21.txt AC 173 ms 95012 KiB
01_random_22.txt AC 174 ms 95164 KiB
01_random_23.txt AC 174 ms 95140 KiB
01_random_24.txt AC 172 ms 95064 KiB
02_hand_00.txt AC 165 ms 94416 KiB
02_hand_01.txt AC 190 ms 108636 KiB
02_hand_02.txt AC 189 ms 109132 KiB
03_after_contest_00.txt AC 177 ms 99784 KiB