結果
問題 |
No.924 紲星
|
ユーザー |
![]() |
提出日時 | 2025-06-12 13:49:15 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,637 bytes |
コンパイル時間 | 201 ms |
コンパイル使用メモリ | 82,560 KB |
実行使用メモリ | 77,732 KB |
最終ジャッジ日時 | 2025-06-12 13:49:23 |
合計ジャッジ時間 | 7,262 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 5 TLE * 1 -- * 10 |
ソースコード
import bisect def merge(a, b): merged = [] i = j = 0 while i < len(a) and j < len(b): if a[i] < b[j]: merged.append(a[i]) i += 1 else: merged.append(b[j]) j += 1 merged.extend(a[i:]) merged.extend(b[j:]) return merged def build_merge_sort_tree(A): tree = [] current_level = [] for num in A: sorted_list = [num] prefix_sums = [0, num] current_level.append((sorted_list, prefix_sums)) tree.append(current_level) level = 0 while len(current_level) > 1: next_level = [] i = 0 while i < len(current_level): if i + 1 < len(current_level): left_sorted, left_prefix = current_level[i] right_sorted, right_prefix = current_level[i + 1] merged_sorted = merge(left_sorted, right_sorted) merged_prefix = [0] s = 0 for num in merged_sorted: s += num merged_prefix.append(s) next_level.append((merged_sorted, merged_prefix)) i += 2 else: next_level.append(current_level[i]) i += 1 tree.append(next_level) current_level = next_level level += 1 return tree def query_count_sum(tree, L, R, x): count = 0 sum_val = 0 root_level = len(tree) - 1 stack = [(root_level, 0)] while stack: level, node_idx = stack.pop() if level >= len(tree): continue node_list = tree[level] if node_idx >= len(node_list): continue sorted_list, prefix_sums = node_list[node_idx] size = 1 << level start = node_idx * size end = start + size - 1 if end < L or start > R: continue if L <= start and end <= R: pos = bisect.bisect_right(sorted_list, x) count += pos sum_val += prefix_sums[pos] continue if level == 0: if start >= L and start <= R: if sorted_list[0] <= x: count += 1 sum_val += sorted_list[0] else: left_child = 2 * node_idx right_child = 2 * node_idx + 1 stack.append((level - 1, right_child)) stack.append((level - 1, left_child)) return count, sum_val def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 Q = int(input[ptr]) ptr += 1 A = list(map(int, input[ptr:ptr + N])) ptr += N prefix = [0] * (N + 1) for i in range(N): prefix[i + 1] = prefix[i] + A[i] B = sorted(A) tree = build_merge_sort_tree(A) for _ in range(Q): L = int(input[ptr]) - 1 ptr += 1 R = int(input[ptr]) - 1 ptr += 1 len_sub = R - L + 1 k = (len_sub + 1) // 2 low = 0 high = len(B) - 1 answer_x = B[0] while low <= high: mid = (low + high) // 2 x = B[mid] cnt, s = query_count_sum(tree, L, R, x) if cnt >= k: answer_x = x high = mid - 1 else: low = mid + 1 cnt_less, sum_less = query_count_sum(tree, L, R, answer_x) sum_total = prefix[R + 1] - prefix[L] sum_greater = sum_total - sum_less ans = answer_x * cnt_less - sum_less + (sum_greater - answer_x * (len_sub - cnt_less)) print(ans) if __name__ == "__main__": main()