結果
| 問題 | No.3509 Get More Money |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 16:44:04 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,957 bytes |
| 記録 | |
| コンパイル時間 | 622 ms |
| コンパイル使用メモリ | 85,376 KB |
| 実行使用メモリ | 157,528 KB |
| 最終ジャッジ日時 | 2026-04-18 16:45:57 |
| 合計ジャッジ時間 | 111,777 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 57 TLE * 3 |
ソースコード
import sys
input = lambda :sys.stdin.readline()[:-1]
ni = lambda :int(input())
na = lambda :list(map(int,input().split()))
yes = lambda :print("yes");Yes = lambda :print("Yes");YES = lambda : print("YES")
no = lambda :print("no");No = lambda :print("No");NO = lambda : print("NO")
#######################################################################
"""
maxmize sum_{i <= n} -A[i]x[i] + C[i]y[i]
C[i]D[i] - minimize A[i]x[i] + B[i]y[i]
0 <= sum_{i <= n} x[i] - y[i] <= K (all n)
0 <= sum_{i <= n} x[i] - (D[i] - y[i]) <= K
sum(D) <= sum(x) + sum(y) <= sum(D) + K
d[1] <= z[1] <= d[1] + K
d[1] + d[2] <= z[1] + z[2] <= d[1] + d[2] + K
x[i] = d[i] + K とする
x[i] > 0 となる i の中で max(p[i]) を選ぶ
"""
from heapq import *
# https://maspypy.com/segment-tree-のお勉強2
# verified : https://judge.yosupo.jp/problem/range_affine_range_sum
class LazySegmentTree:
def __init__(self, N: int, op, e, mapping, composition, id_) -> None:
self._N = N
self._log = (N - 1).bit_length()
self._size = 1 << self._log
self._op = op
self._e = e
self._mapping = mapping
self._composition = composition
self._id = id_
self._data = [e] * (2 * self._size)
self._lazy = [id_] * self._size
def build(self, seq: list) -> None:
"""O(N)で初期化する, 個別にsetするとO(NlogN)になるので注意"""
for i, x in enumerate(seq, self._size):
self._data[i] = x
for i in range(self._size - 1, 0, -1):
self._data[i] = self._op(self._data[2 * i], self._data[2 * i + 1])
def _push(self, i: int) -> None:
if self._lazy[i] == self._id:
return
self._data[2 * i] = self._mapping(self._lazy[i], self._data[2 * i])
self._data[2 * i + 1] = self._mapping(self._lazy[i], self._data[2 * i + 1])
if 2 * i < self._size:
self._lazy[2 * i] = self._composition(self._lazy[i], self._lazy[2 * i])
self._lazy[2 * i + 1] = self._composition(self._lazy[i], self._lazy[2 * i + 1])
self._lazy[i] = self._id
return
def prod(self, L: int, R: int):
"""O(logN)で[L, R)の区間積を取得"""
assert 0 <= L <= R <= self._N
if L == R:
return self._e
L += self._size
R += self._size
for h in range(self._log, 0, -1):
self._push(L >> h)
self._push((R - 1) >> h)
vL = self._e
vR = self._e
while L < R:
if L & 1:
vL = self._op(vL, self._data[L])
L += 1
if R & 1:
vR = self._op(self._data[R - 1], vR)
L //= 2
R //= 2
return self._op(vL, vR)
def apply(self, L: int, R: int, x) -> None:
"""O(logN)で[L, R)の更新"""
assert 0 <= L <= R <= self._N
if L == R:
return
L += self._size
R += self._size
L0, R0 = L, R
for h in range(self._log, 0, -1):
self._push(L >> h)
self._push((R - 1) >> h)
while L < R:
if L & 1:
self._data[L] = self._mapping(x, self._data[L])
if L < self._size:
self._lazy[L] = self._composition(x, self._lazy[L])
L += 1
if R & 1:
R -= 1
self._data[R] = self._mapping(x, self._data[R])
if R < self._size:
self._lazy[R] = self._composition(x, self._lazy[R])
L //= 2
R //= 2
l0 = (L0 & -L0).bit_length()
r0 = (R0 & -R0).bit_length()
for i in range(1, self._log + 1):
L0 //= 2
R0 //= 2
if i >= l0:
self._data[L0] = self._op(self._data[2 * L0], self._data[2 * L0 + 1])
if i >= r0:
self._data[R0] = self._op(self._data[2 * R0], self._data[2 * R0 + 1])
def op(x, y):
return min(x, y)
def mapp(f, x):
return x + f
def comp(x, y):
return x + y
inf = 10 ** 18
for _ in range(ni()):
n, k = na()
a = na()
b = na()
c = na()
d = na()
lst = LazySegmentTree(n, op, inf, mapp, comp, 0)
xx = k
f = []
for i in range(n):
xx += d[i]
f.append(xx)
lst.build(f)
ans = sum(c[i] * d[i] for i in range(n))
hq = []
res = [0] * n
for i in range(n):
heappush(hq, (a[i], b[i], i))
heappush(hq, (c[i], d[i], i))
x = d[i]
# print(hq, d[i], [lst.prod(i, i + 1) for i in range(n)])
while x:
p, q, j = heappop(hq)
rest = min(q, lst.prod(j, n))
y = min(x, rest)
res[j] += y
ans -= y * p
x -= y
lst.apply(j, n, -y)
if y < rest:
heappush(hq, (p, rest - y, j))
print(ans)
# print(res)