砍樹 (APCS 2020-01 中高級)

1.0s 256M

\(N\) 棵樹種在一條從座標 \(0\) 到座標 \(L\) 的線段上。第 \(i\) 棵樹的位置是 \(c_i\),高度是 \(h_i\)。

現階段要砍一棵尚未砍除的樹時,必須選擇讓它向左或向右倒下。若向左倒下,它會覆蓋區間 \([c_i-h_i,c_i]\);若向右倒下,它會覆蓋區間 \([c_i,c_i+h_i]\)。倒下的區間不可超出 \([0,L]\),而且區間內不可有其他尚未砍除的樹。若其他樹剛好在倒下區間的端點,不算被壓到。

你可以不斷選擇一棵目前可以砍除的樹,將它砍倒並移除,直到沒有任何樹可以砍除為止。可以證明,無論砍樹順序為何,最後能被砍除的樹木集合都相同。

請輸出最後能砍除的樹木數量,以及這些樹木中最高的高度。

輸入格式

第一行包含兩個整數 \(N\)、\(L\),代表樹木數量與右邊界座標。

第二行包含 \(N\) 個整數 \(c_1,c_2,\ldots,c_N\),代表每棵樹的位置,並且已由小到大排序。

第三行包含 \(N\) 個整數 \(h_1,h_2,\ldots,h_N\),代表每棵樹的高度。

限制

  • \(1 \le N \le 10^5\)
  • \(1 \le L \le 10^9\)
  • \(0 \le c_1 < c_2 < \cdots < c_N \le L\)
  • \(1 \le h_i \le 10^9\)

輸出格式

第一行輸出最後能被砍除的樹木數量。

第二行輸出能被砍除的樹木中最高的高度;若沒有任何樹能被砍除,請輸出 0

評分說明

  • 30 分:\(N \le 1000\)
  • 70 分:無額外限制

範例輸入

6 140
10 30 50 70 100 125
30 15 55 10 55 25

範例輸出

4
30

範例解釋

一種可行順序是砍除第 \(2\)、第 \(4\)、第 \(6\)、第 \(1\) 棵樹。最後共砍除 \(4\) 棵,最高高度為 \(30\)。

題目來源

APCS 2020 年 1 月程式實作題第 3 題「砍樹」,亦收錄於 ZeroJudge h028

題目頁說明

快速鍵

主要功能

  • 範例測試 — 執行題目附帶的範例測資並自動比對預期輸出。
  • 自訂測試 — 自己貼 stdin 執行程式。可勾選「與預期輸出比對 (diff)」做行對行比對。
  • 模板 — 貼上你在個人資料設定的預設程式碼模板。
  • 協作 — 與其他同學共筆編輯這題的程式碼。
  • 自動草稿 — 編輯器內容每 1.5 秒自動存到瀏覽器(per 帳號 / 題目 / 語言)。
  • 提交 — 把程式碼交給 judge 評測,回傳 AC / WA / TLE 等結果。

限制

  • 程式碼最多 65,536 字元
  • 自訂測試 stdin 與預期輸出各最多 1 MB (約 100 萬字元)
  • 自訂測試與範例測試共用一個沙箱,每人約 3 秒 1 次 (範例測試 1 秒 1 次)
  • 自訂測試與範例測試都有 15 秒 牆鐘上限(正式評測仍依題目原本時限)
  • 互動題不提供自訂測試(無法模擬與 judge 互動)。
  • 提交評測本身沒有 rate limit,但同題短時間內多次提交會被視為刷分。