結果
| 問題 |
No.489 株に挑戦
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-08-21 19:28:38 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 286 ms / 1,000 ms |
| コード長 | 1,635 bytes |
| コンパイル時間 | 164 ms |
| コンパイル使用メモリ | 82,096 KB |
| 実行使用メモリ | 97,084 KB |
| 最終ジャッジ日時 | 2024-07-20 00:16:39 |
| 合計ジャッジ時間 | 6,872 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
from collections import defaultdict
from bisect import bisect_left
class SegmentTree:
def __init__(self, N, mode):
n_ = 1
while n_ < N:
n_ *= 2
self.n = n_
self.mode = mode
if self.mode == min:
self.arr = [2**31-1] * (2*self.n - 1)
elif self.mode == max:
self.arr = [-2**31+1] * (2*self.n - 1)
def update(self, k, a):
k += self.n - 1
self.arr[k] = a
while k > 0:
k = (k - 1) // 2
self.arr[k] = self.mode(self.arr[2*k+1], self.arr[2*k+2])
def query(self, l, r):
L, R = l + self.n, r + self.n
if self.mode == min:
res = 2**31-1
else:
res = -2**31+1
while L < R:
if R & 1:
R -= 1
res = self.mode(res, self.arr[R-1])
if L & 1:
res = self.mode(res, self.arr[L-1])
L += 1
L >>= 1
R >>= 1
return res
N, D, K = map(int, input().split())
x = [int(input()) for _ in range(N)]
st = SegmentTree(N, max)
d = defaultdict(list)
for i in range(N):
st.update(i, x[i])
d[x[i]].append(i)
ans = 0
s, e = None, None
for i in range(N-1):
before = x[i]
after = st.query(i+1, min(N, i+1+D))
profit = (after - before) * K
if profit > ans:
s = i
index = bisect_left(d[after], i)
e = d[after][index]
ans = profit
print(ans)
if ans > 0:
print(s, e)