結果
| 問題 |
No.33 アメーバがたくさん
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-08-07 12:30:57 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,423 bytes |
| コンパイル時間 | 281 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 812,464 KB |
| 最終ジャッジ日時 | 2024-09-24 10:15:27 |
| 合計ジャッジ時間 | 7,223 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 MLE * 1 -- * 2 |
ソースコード
def read_data():
N, D, T = map(int, input().split())
Xs = list(map(int, input().split()))
return N, D, T, Xs
def solve(N, D, T, Xs):
'''
重なる可能性があるのは、
xi % D == xj % D となるものだけ。
xi % D の値によってグループ分けして考える。
分類後の位置は、xi // D = yi で座標圧縮して考える。
同一グループに存在する各アメーバのT秒後の左端位置、右端位置は、
{yi - T, yi + T}
yiの値でソートして、小さいのから順に、次のアメーバと重なっているかどうかを判定していけば良い。
'''
ameba_groups = [[] for i in range(D)]
for x in Xs:
y, z = divmod(x, D)
ameba_groups[z].append(y)
total = 0
for ameba_group in ameba_groups:
if len(ameba_group) < 2:
total += len(ameba_group) * (1 + 2 * T)
continue
ameba_group.sort()
y = ameba_group[0]
left = y - T
right = y + T
for y in ameba_group[1:]:
if y - T <= right: # 重なっている場合
right = y + T
else: # 重なっていない場合
total += right - left + 1
left = y - T
right = y + T
total += right - left + 1
return total
N, D, T, Xs = read_data()
print(solve(N, D, T, Xs))