結果
問題 | No.1012 荷物収集 |
ユーザー | はむ吉🐹 |
提出日時 | 2020-03-20 22:51:36 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 791 ms / 2,000 ms |
コード長 | 1,224 bytes |
コンパイル時間 | 110 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 41,376 KB |
最終ジャッジ日時 | 2024-12-15 07:38:06 |
合計ジャッジ時間 | 18,328 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
#!/usr/bin/env python3 import bisect import itertools class CumulativeSum(object): def __init__(self, sequence): self.cumulative_sum = [0] self.cumulative_sum.extend(itertools.accumulate(sequence)) def partial_sum(self, first, last): return self.cumulative_sum[last + 1] - self.cumulative_sum[first] def process_queries(xs0, ws0, ys): pairs = sorted(zip(xs0, ws0)) xs = [x for x, _ in pairs] ws = [w for _, w in pairs] n = len(xs) w_cs = CumulativeSum(ws) xw_cs = CumulativeSum(x * w for x, w in zip(xs, ws)) for y in ys: pos = bisect.bisect(xs, y) left_sum = y * w_cs.partial_sum(0, pos - 1) - \ xw_cs.partial_sum(0, pos - 1) right_sum = xw_cs.partial_sum( pos, n - 1) - y * w_cs.partial_sum(pos, n - 1) all_sum = left_sum + right_sum yield all_sum def main(): n, q = (int(z) for z in input().split()) xs = [] ws = [] for _ in range(n): x, w = (int(z) for z in input().split()) xs.append(x) ws.append(w) ys = [int(z) for z in input().split()] for res in process_queries(xs, ws, ys): print(res) if __name__ == "__main__": main()