結果
問題 |
No.1496 不思議な数え上げ
|
ユーザー |
![]() |
提出日時 | 2025-04-15 21:03:31 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,227 bytes |
コンパイル時間 | 200 ms |
コンパイル使用メモリ | 82,316 KB |
実行使用メモリ | 133,908 KB |
最終ジャッジ日時 | 2025-04-15 21:08:33 |
合計ジャッジ時間 | 8,132 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 3 TLE * 1 -- * 35 |
ソースコード
import bisect def main(): import sys input = sys.stdin.read data = input().split() idx = 0 n = int(data[idx]) idx += 1 P = list(map(int, data[idx:idx+n])) idx += n A = list(map(int, data[idx:idx+n])) idx += n position = [0] * (n + 2) for i in range(n): val = P[i] position[val] = i + 1 # 1-based index # Compute L and R using monotonic stack L = [0] * (n + 2) stack = [] for i in range(1, n + 1): while stack and stack[-1][0] >= P[i - 1]: stack.pop() if not stack: L[i] = 0 else: L[i] = stack[-1][1] stack.append((P[i - 1], i)) R = [n + 1] * (n + 2) stack = [] for i in range(n, 0, -1): while stack and stack[-1][0] >= P[i - 1]: stack.pop() if not stack: R[i] = n + 1 else: R[i] = stack[-1][1] stack.append((P[i - 1], i)) # Compute prefix sums S (1-based) S = [0] * (n + 1) for i in range(1, n + 1): S[i] = S[i - 1] + P[i - 1] # Process each i from 1 to n result = [] for i in range(1, n + 1): pos = position[i] left = L[pos] + 1 right = R[pos] - 1 if left > pos or right < pos: result.append(0) continue a_i = A[i - 1] # Calculate count_e: left end is pos X_e = a_i + S[pos - 1] start_e = pos end_e = right count_e = 0 if start_e <= end_e: r_e = bisect.bisect_right(S, X_e, start_e, end_e + 1) - 1 r_e = min(r_e, end_e) if r_e >= start_e: count_e = r_e - start_e + 1 # Calculate count_f: left end is in [left, pos-1] count_f = 0 if left <= pos - 1: r_max = end_e for l in range(pos - 1, left - 1, -1): X = a_i + S[l - 1] while r_max >= pos and S[r_max] > X: r_max -= 1 if r_max >= pos: count_f += r_max - pos + 1 total = count_e + count_f result.append(total) print('\n'.join(map(str, result))) if __name__ == "__main__": main()