제출 #659432

#제출 시각아이디문제언어결과실행 시간메모리
659432pizetJob Scheduling (CEOI12_jobs)Pypy 3
0 / 100
1094 ms65536 KiB
#!/usr/bin/env python3

import math
import sys
input = lambda: sys.stdin.readline().rstrip("\r\n")

def test_case():
    n, d, m = map(int, input().split())
    jobs = []
    cnt = [0 for _ in range(n+1)]
    i = 1
    for x in input().split():
        jobs.append([int(x), i])
        cnt[jobs[-1][0]] += 1
        i += 1
    jobs.sort()
#    print(jobs)

    def cond(x):
        max_d = 0
        j = 0
        for i in range(1, n+1):
            curr = 0
            while j < m and curr < x and jobs[j][0] <= i:
#                print(i, jobs[j])
                max_d = max(max_d, i-jobs[j][0])
                if max_d > d: return False
                curr += 1
                j += 1
#        print(x, max_d)
#        print("=======")
        return True

    def cond2(x):
        req_num = 0
        schedule = [[] for _ in range(n)]
        for day in range(1, n+1):
            for j in range(x):
                if jobs[req_num][0] > day:
                    break
                if jobs[req_num][0] + d >= day:
                    schedule[day-1].append(jobs[req_num][1])
                    req_num += 1
                else:
                    return False, schedule
                if req_num == m:
                    return True, schedule
        return False, schedule



    def discrete_binary_search(func, lo, hi):
        """ Locate the first value x s.t. func(x) = True within [lo, hi] """
        res = []
        while lo < hi:
            mi = lo + (hi - lo) // 2
            res1, res2 = func(mi)
            if res1:
                hi = mi
                res = res2
            else:
                lo = mi + 1

        return lo, res

    ans, res = discrete_binary_search(cond2, 1, m)
    print(ans)
    for i in range(n):
        if len(res[i]) > 0:
            print(*res[i], end=' ')
            print(0)
        else:
            print(0)

def main():
    t = 1
#    t = int(input())
    for _ in range(t):
        test_case()

if __name__ == '__main__':
    main()
#Verdict Execution timeMemoryGrader output
Fetching results...