結果
| 問題 |
No.1043 直列大学
|
| コンテスト | |
| ユーザー |
tpyneriver
|
| 提出日時 | 2020-05-02 19:05:23 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 682 ms / 2,000 ms |
| コード長 | 2,928 bytes |
| コンパイル時間 | 688 ms |
| コンパイル使用メモリ | 82,320 KB |
| 実行使用メモリ | 164,304 KB |
| 最終ジャッジ日時 | 2024-12-22 20:04:08 |
| 合計ジャッジ時間 | 9,875 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
import sys
from collections import Counter
from operator import add
readline = sys.stdin.readline
MOD = 10**9+7
class Segtree:
def __init__(self, A, intv, initialize = True, segf = max):
self.N = len(A)
self.N0 = 2**(self.N-1).bit_length()
self.intv = intv
self.segf = segf
if initialize:
self.data = [intv]*self.N0 + A + [intv]*(self.N0 - self.N)
for i in range(self.N0-1, 0, -1):
self.data[i] = self.segf(self.data[2*i], self.data[2*i+1])
else:
self.data = [intv]*(2*self.N0)
def update(self, k, x):
k += self.N0
self.data[k] = x
while k > 0 :
k = k >> 1
self.data[k] = self.segf(self.data[2*k], self.data[2*k+1])
def query(self, l, r):
L, R = l+self.N0, r+self.N0
s = self.intv
while L < R:
if R & 1:
R -= 1
s = self.segf(s, self.data[R])
if L & 1:
s = self.segf(s, self.data[L])
L += 1
L >>= 1
R >>= 1
return s
def binsearch(self, l, r, check, reverse = False):
L, R = l+self.N0, r+self.N0
SL, SR = [], []
while L < R:
if R & 1:
R -= 1
SR.append(R)
if L & 1:
SL.append(L)
L += 1
L >>= 1
R >>= 1
if reverse:
for idx in (SR + SL[::-1]):
if check(self.data[idx]):
break
else:
return -1
while idx < self.N0:
if check(self.data[2*idx+1]):
idx = 2*idx + 1
else:
idx = 2*idx
return idx - self.N0
else:
for idx in (SL + SR[::-1]):
if check(self.data[idx]):
break
else:
return -1
while idx < self.N0:
if check(self.data[2*idx]):
idx = 2*idx
else:
idx = 2*idx + 1
return idx - self.N0
N, M = map(int, readline().split())
V = list(map(int, readline().split()))
R = list(map(int, readline().split()))
A, B = map(int, readline().split())
limit = 10**5+2
tablev = Counter()
tabler = Counter()
tablev[0] = 1
tabler[0] = 1
for v in V:
for k, val in tablev.copy().items():
tablev[v+k] += val
for r in R:
for k, val in tabler.copy().items():
tabler[r+k] += val
tablev[0] = 0
tabler[0] = 0
TV = [0]*limit
for i in range(limit):
TV[i] = tablev[i]
ans = 0
T = Segtree(TV, 0, initialize = True, segf = add)
for k, v in tabler.items():
left, right = k*A, k*B
left = min(left, limit)
right = min(right, limit) + 1
ans = (ans + v*T.query(left, right))%MOD
print(ans)
tpyneriver