結果
| 問題 |
No.3210 Fixed Sign Sequense
|
| コンテスト | |
| ユーザー |
dp_ijk
|
| 提出日時 | 2025-07-25 21:29:24 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 349 ms / 2,000 ms |
| コード長 | 2,797 bytes |
| コンパイル時間 | 330 ms |
| コンパイル使用メモリ | 82,240 KB |
| 実行使用メモリ | 144,648 KB |
| 最終ジャッジ日時 | 2025-07-25 21:29:41 |
| 合計ジャッジ時間 | 9,664 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
def solve(N, S):
pos = FenwickTree(N)
neg = FenwickTree(N)
for i, ch in enumerate(S):
match ch:
case "+":
pos[i] = 1
case "-":
neg[i] = 1
RLE = run_length(S)
res = 0
for k, (l, r) in RLE:
if k == "+":
res = max(res, r-l)
if k == "-":
res = max(res, r-l)
for i, ch in enumerate(S):
match ch:
case "+":
R = pos[i:]
L = neg[:i]
res = max(res, L+R)
case "0":
R = pos[i:]
L = neg[:i]
res = max(res, L+R+1)
return res
class FenwickTree:
def __init__(self, seq=()):
if isinstance(seq, (int, float)):
self.data = [0]*int(seq)
self.N = len(self.data)
self.tree = [0]*(self.N + 1)
self.total = 0
else:
self.tree = [0]
self.tree.extend(seq)
self.data = [0+x for x in self.tree[1:]]
self.total = sum(self.data)
self.N = len(self.data)
for i in range(1, self.N + 1):
if i + (i& -i) <= self.N:
self.tree[i + (i& -i)] += self.tree[i]
def get(self, i):
assert 0 <= i < self.N
return self.data[i]
def add(self, i, x):
if x == 0: return
assert 0 <= i < self.N
self.data[i] += x
self.total += x
i += 1
while i <= self.N:
self.tree[i] += x
i += i& -i
def prefix(self, n):
if n >= self.N: return self.total
res = 0
while n > 0:
res += self.tree[n]
n &= n-1
return res
def sum(self, l, r):
if l < 0: l = 0
if r > self.N: r = self.N
if l >= r: return 0
return self.prefix(r) - self.prefix(l)
def __getitem__(self, idx: int|slice):
if isinstance(idx, int):
if idx < 0:
idx += self.N
return self.get(idx)
else:
l = idx.start
r = idx.stop
if l is None: l = 0
if r is None: r = self.N
return self.sum(l, r)
def set(self, i, x):
if i < 0:
i += self.N
self.add(i, x - self.get(i))
__setitem__ = set
def __delitem__(self, i):
assert 0 <= i < self.N
self.add(i, -self.get(i))
def __iter__(self):
return iter(self.data)
def __repr__(self):
return repr(self.data)
def __len__(self):
return self.N
apply_at = add
fold = sum
def run_length(A, *, key=None):
A = list(A)
res = []
for i, a in enumerate(A):
if key is None: k = a
else: k = key(a)
if res and res[-1][0] == k:
res[-1][-1] += 1
else:
res.append([k, i, i+1])
return [(k, (l, r)) for (k, l, r) in res]
N = int(input())
S = input()
ans = solve(N, S)
print(ans)
dp_ijk