Submission #68048062


Source Code Expand

import * as fs from 'fs';

/**
 * 仕事情報型: [開始日, 報酬]
 */
type Job = [number, number];

/**
 * 最大収益を求める関数
 * @param N - 仕事の件数(1 ≦ N ≦ 2×10^5)
 * @param D - 就業可能日数(1 ≦ D ≦ 2000)
 * @param jobs - 各仕事の情報(開始可能日、報酬)
 * @returns 最大で得られる報酬
 */
function getMaxEarnings(N: number, D: number, jobs: Job[]): number {
  const jobByDay: number[][] = Array.from({ length: D + 1 }, () => []);

  // 各日の仕事を分類
  for (const [x, y] of jobs) {
    if (x <= D) jobByDay[x].push(y);
  }

  const maxHeap = new MaxHeap();
  let total = 0;

  for (let day = 1; day <= D; day++) {
    for (const reward of jobByDay[day]) {
      maxHeap.push(reward);
    }
    if (maxHeap.size() > 0) {
      total += maxHeap.pop()!;
    }
  }

  return total;
}

/**
 * 最大ヒープクラス(優先度付きキュー)
 */
class MaxHeap {
  private data: number[] = [];

  push(val: number): void {
    this.data.push(val);
    this.heapifyUp(this.data.length - 1);
  }

  pop(): number | undefined {
    if (this.data.length === 0) return undefined;
    const top = this.data[0];
    const last = this.data.pop()!;
    if (this.data.length > 0) {
      this.data[0] = last;
      this.heapifyDown(0);
    }
    return top;
  }

  size(): number {
    return this.data.length;
  }

  private heapifyUp(i: number): void {
    while (i > 0) {
      const parent = (i - 1) >> 1;
      if (this.data[parent] >= this.data[i]) break;
      [this.data[parent], this.data[i]] = [this.data[i], this.data[parent]];
      i = parent;
    }
  }

  private heapifyDown(i: number): void {
    const n = this.data.length;
    while (true) {
      let largest = i;
      const left = 2 * i + 1;
      const right = 2 * i + 2;
      if (left < n && this.data[left] > this.data[largest]) largest = left;
      if (right < n && this.data[right] > this.data[largest]) largest = right;
      if (largest === i) break;
      [this.data[i], this.data[largest]] = [this.data[largest], this.data[i]];
      i = largest;
    }
  }
}

/**
 * 標準入力からデータを読み込み、最大収益を出力
 */
function main(): void {
  const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
  const [N, D] = input[0].split(' ').map(Number);
  const jobs: Job[] = input.slice(1).map(line => {
    const [x, y] = line.split(' ').map(Number);
    return [x, y];
  });

  const result = getMaxEarnings(N, D, jobs);
  console.log(result);
}

main();

Submission Info

Submission Time
Task B39 - Taro's Job
User myoshizumi
Language TypeScript 5.1 (Node.js 18.16.1)
Score 1000
Code Size 2649 Byte
Status AC
Exec Time 229 ms
Memory 118112 KiB

Compile Error


			

			
				

Judge Result

Set Name Sample Subtask1 All
Score / Max Score 0 / 0 200 / 200 800 / 800
Status
AC × 1
AC × 11
AC × 17
Set Name Test Cases
Sample sample_01.txt
Subtask1 sample_01.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt
All rand_01.txt, rand_02.txt, rand_03.txt, rand_04.txt, rand_05.txt, rand_06.txt, sample_01.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt
Case Name Status Exec Time Memory
rand_01.txt AC 210 ms 108688 KiB
rand_02.txt AC 151 ms 88120 KiB
rand_03.txt AC 155 ms 88924 KiB
rand_04.txt AC 122 ms 74604 KiB
rand_05.txt AC 127 ms 75716 KiB
rand_06.txt AC 229 ms 118112 KiB
sample_01.txt AC 39 ms 42692 KiB
subtask1_01.txt AC 42 ms 43884 KiB
subtask1_02.txt AC 41 ms 43824 KiB
subtask1_03.txt AC 43 ms 44732 KiB
subtask1_04.txt AC 41 ms 43984 KiB
subtask1_05.txt AC 42 ms 44512 KiB
subtask1_06.txt AC 40 ms 43944 KiB
subtask1_07.txt AC 48 ms 49200 KiB
subtask1_08.txt AC 44 ms 44712 KiB
subtask1_09.txt AC 50 ms 49256 KiB
subtask1_10.txt AC 40 ms 43376 KiB