結果
問題 | No.674 n連勤 |
ユーザー | attaka |
提出日時 | 2023-04-03 03:45:01 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,358 bytes |
コンパイル時間 | 99 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 11,776 KB |
最終ジャッジ日時 | 2024-09-25 00:43:25 |
合計ジャッジ時間 | 2,074 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | RE | - |
testcase_01 | RE | - |
testcase_02 | RE | - |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | RE | - |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | RE | - |
testcase_09 | RE | - |
testcase_10 | RE | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | RE | - |
testcase_19 | RE | - |
ソースコード
from typing import List from bisect import bisect_left from collections import deque class LazySegTree: def __init__(self, size: int): self.size = 1 while self.size < size: self.size <<= 1 self.lazy = [None] * (2 * self.size - 1) self.seg = [0] * (2 * self.size - 1) def update(self, a: int, b: int, x: int, k: int = 0, l: int = 0, r: int = -1): if r == -1: r = self.size self._lazyprop(k, l, r) if r <= a or b <= l: return if a <= l and r <= b: self.lazy[k] = x self._lazyprop(k, l, r) else: m = (l + r) // 2 self.update(a, b, x, 2 * k + 1, l, m) self.update(a, b, x, 2 * k + 2, m, r) self.seg[k] = max(self.seg[2 * k + 1], self.seg[2 * k + 2]) def get(self, a: int, b: int, k: int = 0, l: int = 0, r: int = -1) -> int: if r == -1: r = self.size if self.lazy[k] is not None: self._lazyprop(k, l, r) if r <= a or b <= l: return 0 if a <= l and r <= b: return self.seg[k] m = (l + r) // 2 return max(self.get(a, b, 2 * k + 1, l, m), self.get(a, b, 2 * k + 2, m, r)) def _lazyprop(self, k: int, l: int, r: int): if self.lazy[k] is not None: self.seg[k] = self.lazy[k] if r - l > 1: self.lazy[2 * k + 1] = self.lazy[k] self.lazy[2 * k + 2] = self.lazy[k] self.lazy[k] = None def max_consecutive_days(D: int, jobs: List[List[int]]) -> List[int]: jobs = sorted(jobs, key=lambda x: x[1]) days = [0] * (2 * len(jobs) + 1) for i in range(len(jobs)): days[2 * i + 1] = jobs[i][0] days[2 * i + 2] = jobs[i][1] + 1 days[-1] = D + 1 dic = {d: i for i, d in enumerate(sorted(set(days)))} seg = LazySegTree(len(dic)) ans = [] for job in jobs: a, b = dic[job[0]], dic[job[1] + 1] seg.update(a, b, seg.get(a, b) + 1) length = seg.get(0, len(dic)) ans.append(length) return ans # 入力受け取り D = int(input()) periods = [] for i in range(Q): a, b = map(int, input().split()) periods.append((a, b)) # 最大連勤日数を計算 ans = max_consecutive_days(D, periods) # 結果を出力 print(ans)