Submission #1281480

#TimeUsernameProblemLanguageResultExecution timeMemory
1281480osserJob Scheduling (CEOI12_jobs)Pypy 3
0 / 100
265 ms131072 KiB
import sys
from array import array

# -------- быстрый ввод --------
data = sys.stdin.buffer.read().split()
it = iter(data)
def ni() -> int:
    return int(next(it))

N = ni()    # кол-во дней
D = ni()    # макс. задержка
M = ni()    # кол-во заявок

# дни подачи заявок S[0..M-1], гарантия: S[i] <= N - D
S = [ni() for _ in range(M)]

# -------- сформируем "плоский" порядок заявок, отсортированный по дню подачи --------
# cnt[d] = сколько заявок пришло в день d
cnt = [0] * (N + 2)
for s in S:
    cnt[s] += 1

# start[d] = начало блока заявок дня d в плоском массиве
start = [0] * (N + 2)
acc = 0
for d in range(1, N + 1):
    start[d] = acc
    acc += cnt[d]

# текущее место записи для каждого дня
cur = start[:]

# плоские массивы: arrivals[k] = день подачи k-й заявки в отсорт. порядке
#                  ids[k]      = id заявки (1..M) в том же порядке
arrivals = array('I', [0] * M)
ids      = array('I', [0] * M)

for idx, s in enumerate(S, 1):
    p = cur[s]
    arrivals[p] = s
    ids[p] = idx
    cur[s] += 1

# -------- проверка выполнимости для K машин --------
def feasible(K: int) -> bool:
    req = 0  # сколько уже назначили (указатель по плоскому массиву)
    # симулируем дни 1..N
    for day in range(1, N + 1):
        used = 0
        # пока есть свободные машины и есть заявки, уже успевшие прийти
        while used < K and req < M and arrivals[req] <= day:
            s = arrivals[req]
            if s + D < day:   # дедлайн просрочен -> K недостаточно
                return False
            req += 1
            used += 1
        # если следующая заявка ещё не пришла, машины простаивают — это нормально
    return req == M  # все назначены?

# -------- напечатать расписание для минимального K --------
def emit_schedule(K: int):
    out = sys.stdout.write
    req = 0
    for day in range(1, N + 1):
        taken = 0
        first = True
        # берём до K заявок, уже прибывших, не нарушая дедлайна
        while taken < K and req < M and arrivals[req] <= day:
            s = arrivals[req]
            # для минимального K дедлайн уже не должен нарушаться
            if s + D < day:
                # теоретически не случится (мы печатаем после успешной проверки)
                pass
            if first:
                out(str(ids[req]))
                first = False
            else:
                out(" " + str(ids[req]))
            req += 1
            taken += 1
        if first:
            out("0\n")       # в этот день ничего не делали
        else:
            out(" 0\n")      # список id + завершающий 0

# -------- бинпоиск по числу машин --------
lo, hi = 1, M
while lo < hi:
    mid = (lo + hi) // 2
    if feasible(mid):
        hi = mid
    else:
        lo = mid + 1

# -------- вывод --------
sys.stdout.write(str(lo) + "\n")
emit_schedule(lo)

Compilation message (stdout)

Compiling 'jobs.py'...

=======
  adding: __main__.pyc (deflated 38%)

=======
#Verdict Execution timeMemoryGrader output
Fetching results...