結果
問題 |
No.3015 右に寄せろ!
|
ユーザー |
|
提出日時 | 2025-02-02 17:14:00 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 5,740 bytes |
コンパイル時間 | 234 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 190,592 KB |
最終ジャッジ日時 | 2025-02-02 17:14:55 |
合計ジャッジ時間 | 45,848 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 24 TLE * 12 |
ソースコード
#!/usr/bin/env python3 import math from ast import Call, parse, unparse, walk from bisect import bisect_left, bisect_right from inspect import currentframe, getsourcelines from sys import stdin _tokens = (y for x in stdin for y in x.split()) def read(): return next(_tokens) def iread(): return int(next(_tokens)) def dprint(*args, pretty=True): def _inner(v): def _format_3d(v): return '\n' + '\n'.join(['\n'.join([' '.join([str(z) for z in y]) for y in x]) + '\n' for x in v]).rstrip('\n') def _format_2d(v): return '\n' + '\n'.join([' '.join([str(y) for y in x]) for x in v]) def _dim(v): return (1 + min(_dim(x) for x in v) if v else 1) if isinstance(v, (list, tuple)) else 1 if isinstance(v, str) and len(v) > 1 else 0 dim = _dim(v) if pretty else -1 return _format_3d(v) if dim == 3 else _format_2d(v) if dim == 2 else str(v) frame = currentframe().f_back source_lines, start_line = getsourcelines(frame) tree = parse(source_lines[frame.f_lineno - max(1, start_line)].strip()) call_node = next(node for node in walk(tree) if isinstance(node, Call) and node.func.id == 'dprint') arg_names = [unparse(arg) for arg in call_node.args] print(', '.join([f'\033[4;35m{name}:\033[0m {_inner(value)}' for name, value in zip(arg_names, args)])) class SortedSet: BUCKET_RATIO = 16 SPLIT_RATIO = 24 def __init__(self, a=[]): a = list(a) n = len(a) if any(a[i] > a[i + 1] for i in range(n - 1)): a.sort() if any(a[i] >= a[i + 1] for i in range(n - 1)): a, b = [], a for x in b: if not a or a[-1] != x: a.append(x) n = self._size = len(a) num_bucket = int(math.ceil(math.sqrt(n / self.BUCKET_RATIO))) self._a = [a[n * i // num_bucket: n * (i + 1) // num_bucket] for i in range(num_bucket)] def __iter__(self): for i in self._a: for j in i: yield j def __reversed__(self): for i in reversed(self._a): for j in reversed(i): yield j def __eq__(self, other): return list(self) == list(other) def __len__(self): return self._size def __repr__(self): return 'SortedSet' + str(self._a) def __str__(self): s = str(list(self)) return '{' + s[1: len(s) - 1] + '}' def _position(self, x): for i, a in enumerate(self._a): if x <= a[-1]: break return (a, i, bisect_left(a, x)) def __contains__(self, x): if self._size == 0: return False a, _, i = self._position(x) return i != len(a) and a[i] == x def add(self, x): if self._size == 0: self._a = [[x]] self._size = 1 return True a, b, i = self._position(x) if i != len(a) and a[i] == x: return False a.insert(i, x) self._size += 1 if len(a) > len(self._a) * self.SPLIT_RATIO: mid = len(a) >> 1 self._a[b:b+1] = [a[:mid], a[mid:]] return True def _pop(self, a, b, i): ans = a.pop(i) self._size -= 1 if not a: del self._a[b] return ans def discard(self, x): if self._size == 0: return False a, b, i = self._position(x) if i == len(a) or a[i] != x: return False self._pop(a, b, i) return True def lt(self, x): for a in reversed(self._a): if a[0] < x: return a[bisect_left(a, x) - 1] def le(self, x): for a in reversed(self._a): if a[0] <= x: return a[bisect_right(a, x) - 1] def gt(self, x): for a in self._a: if a[-1] > x: return a[bisect_right(a, x)] def ge(self, x): for a in self._a: if a[-1] >= x: return a[bisect_left(a, x)] def __getitem__(self, i): if i < 0: for a in reversed(self._a): i += len(a) if i >= 0: return a[i] else: for a in self._a: if i < len(a): return a[i] i -= len(a) raise IndexError def pop(self, i=-1): if i < 0: for b, a in enumerate(reversed(self._a)): i += len(a) if i >= 0: return self._pop(a, ~b, i) else: for b, a in enumerate(self._a): if i < len(a): return self._pop(a, b, i) i -= len(a) raise IndexError def index(self, x): ans = 0 for a in self._a: if a[-1] >= x: return ans + bisect_left(a, x) ans += len(a) return ans def index_right(self, x): ans = 0 for a in self._a: if a[-1] > x: return ans + bisect_right(a, x) ans += len(a) return ans def max(self): return self._a[-1][-1] def min(self): return self._a[0][0] def main(): s = list(read()) n = len(s) ss = SortedSet() for i in range(n - 2): if s[i:i + 3] == ['1', '1', '0']: ss.add(i) ans = 0 while ss: i = ss.max() ss.discard(i) s[i], s[i + 2] = s[i + 2], s[i] for j in range(-2, 3): ni = i + j if ni < 0: continue if s[ni:ni + 3] == ['1', '1', '0']: ss.add(ni) ans += 1 print(ans) if __name__ == '__main__': main()