H - まとめ売り
H - まとめ売り
O(QN) 問題文をシミュレーションした際のコードです。 TLEになります。
import math import heapq import itertools from functools import reduce # main def main(): N = int(input()) C = list(map(int, input().split())) Q = int(input()) res = 0 for i in range(0, Q): S = list(map(int, input().split())) if S[0] == 1: x = S[1] - 1 if C[x] - S[2] >= 0: C[x] = C[x] - S[2] res += S[2] if S[0] == 2: ok = True for i in range(0, N, 2): if C[i] - S[1] < 0: ok = False if ok: for i in range(0, N, 2): C[i] = C[i] - S[1] res += S[1] if S[0] == 3: ok = True for i in range(0, N): if C[i] - S[1] < 0: ok = False if ok: for i in range(0, N): C[i] = C[i] - S[1] res += S[1] print(res) # エントリポイント if __name__ == '__main__': main()
クエリの2, 3の時の処理は改善できそうです。 奇数の購入枚数、全種類の購入枚数を保持します。 最後に加算すると良さそうです。
import math import heapq import itertools from functools import reduce # main def main(): N = int(input()) C = list(map(int, input().split())) Q = int(input()) res = 0 s = 0 z = 0 min_s_C = 1000000007 min_z_C = 1000000007 for i in range(0, N): if i % 2 == 0: min_s_C = min(min_s_C, C[i]) else: min_z_C = min(min_z_C, C[i]) for i in range(0, Q): S = list(map(int, input().split())) if S[0] == 1: if (S[1] - 1) % 2 == 0: if C[S[1]-1] - s - z - S[2] >= 0: C[S[1]-1] = C[S[1]-1] - S[2] min_s_C = min(min_s_C, C[S[1]-1]) res += S[2] else: if C[S[1]-1] - z - S[2] >= 0: C[S[1]-1] = C[S[1]-1] - S[2] min_z_C = min(min_z_C, C[S[1]-1]) res += S[2] if S[0] == 2: if min_s_C - s - z - S[1] >= 0: s += S[1] if S[0] == 3: if min(min_s_C - s - z, min_z_C - z) - S[1] >= 0: z += S[1] res += len(C) * z + (len(C)+1) // 2 * s print(res) # エントリポイント if __name__ == '__main__': main()