結果
問題 | No.1554 array_and_me |
ユーザー |
|
提出日時 | 2025-02-01 01:55:21 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 652 ms / 2,000 ms |
コード長 | 2,730 bytes |
コンパイル時間 | 426 ms |
コンパイル使用メモリ | 82,776 KB |
実行使用メモリ | 110,412 KB |
最終ジャッジ日時 | 2025-02-01 01:55:39 |
合計ジャッジ時間 | 17,600 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 41 |
ソースコード
# https://yukicoder.me/problems/no/1554MOD = 998244353MAX_INT = 10 ** 18class SegmentTree:"""非再帰版セグメント木。更新は「加法」、取得は「最大値」のもの限定。"""def __init__(self, init_array):n = 1while n < len(init_array):n *= 2self.size = nself.array = [ [MAX_INT, (0, 1)] for _ in range(2 * self.size)]for i, a in enumerate(init_array):self.array[self.size + i][0] = iself.array[self.size + i][1] = aend_index = self.sizestart_index = end_index // 2while start_index >= 1:for i in range(start_index, end_index):self._op(self.array[i], self.array[2 * i], self.array[2 * i + 1])end_index = start_indexstart_index = end_index // 2def _op(self, array, left, right):l = left[1]r = right[1]if l[0] * r[1] >= l[1] * r[0]:array[0] = left[0]array[1] = left[1]else:array[0] = right[0]array[1] = right[1]def set(self, x, a):index = self.size + xself.array[index][1] = awhile index > 1:index //= 2self._op(self.array[index], self.array[2 * index], self.array[2 * index + 1])def get_max(self, l, r):L = self.size + l; R = self.size + r# 2. 区間[l, r)の最大値を求めるs = [MAX_INT, (0, 1)]while L < R:if R & 1:R -= 1self._op(s, s, self.array[R])if L & 1:self._op(s, s, self.array[L])L += 1L >>= 1; R >>= 1return sdef solve(N, K, A):init_array = [(A[i], 1) for i in range(N)]seg_tree = SegmentTree(init_array)answer = 1for _ in range(K):i, a = seg_tree.get_max(0, seg_tree.size)answer *= a[0]answer %= MODanswer *= pow(a[1], MOD - 2, MOD)answer %= MOD# 追加seg_tree.set(i, (a[0], a[1] + 1))# 計算a_sum = sum(A)a_sum %= MODa_sum_p = pow(a_sum, K, MOD)a_sum_p_inv = pow(a_sum_p, MOD - 2, MOD)answer *= a_sum_p_invanswer %= MODfor k in range(1, K + 1):answer *= kanswer %= MODreturn answerdef main():T = int(input())answers = []for _ in range(T):N, K = map(int, input().split())A = list(map(int, input().split()))ans = solve(N, K, A)answers.append(ans)for ans in answers:print(ans)if __name__ == "__main__":main()