Problem:
最長の階段

問題

1 から n までの整数がそれぞれ 1 つずつ書かれた n 枚のカードと,1 枚の白紙の
カードがある.これら n + 1 枚のカードの内,k 枚のカードが与えられる.ただし,
1 ≤ k ≤ n である.白紙のカードには 1 から n までの整数を 1 つ書くことができ
る.与えられたカードだけで,できるだけ長い連続した整数列を作りたい.

与えられるカードが入力されたときに, 与えられたカードから作ることができる連
続した整数列の最大長を出力するプログラムを作成せよ.

例1

n = 7, k = 5 とする.6, 2, 4, 7, 1 のカードが与えられたとき,このカードを使っ
て作れる連続した整数列のうち最長のものは 1, 2 であり,その長さは 2 である.

例2

n = 7, k = 5 とする.6, 2, 4, 7 と白紙のカードが与えられたとき,このカードを
使って作れる連続した整数列のうち最長のものは,白紙のカードに 5 を書くことに
よってできる 4, 5, 6, 7 であり,その長さは 4 である.

入力

入力は複数のデータセットからなる．各データセットは以下の形式で与えられる．入力はゼロ２つを含む行で終了する．

1 行目には,2 つの整数 n (1 ≤ n ≤ 100000) と k (1 ≤ k ≤ n) がこの順で 1 つの
空白を区切りとして書かれている.続く k 行には整数が 1 つずつ書かれており,与
えられる k 枚のカードに書かれている整数を表している.白紙のカードは 0 で表さ
れる.

採点用データのうち, 配点の 40% 分は 1 ≤ n ≤ 1000, 1 ≤ k ≤ 500 を, 配点の 20% 分は 1 ≤ n ≤ 60000, 1 ≤ k ≤ 50000 を. 配点の 40% 分は 1 ≤ n ≤ 100000, 1 ≤ k ≤ 100000 を満たす.

データセットの数は 5 を超えない．

出力

データセットごとに整数を1行に出力する．

入出力例

入力例

7 5
6
2
4
7
1
7 5
6
2
0
4
7
0 0

出力例

2
4

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in Ruby (judge verdict: Accepted)

### main

loop do
  n, k = gets.strip.split(' ').map{|s| s.to_i}
  break if (n | k) == 0

  as = []
  white = false

  k.times do
    ci = gets.strip.to_i - 1

    if ci < 0
      white = true
    else
      c0 = c1 = ci
      if ci > 0 && ! as[ci - 1].nil?
        c0 = as[ci - 1][0]
      end
      if ci < n - 1 && ! as[ci + 1].nil?
        c1 = as[ci + 1][1]
      end

      as[c0] = as[c1] = [c0, c1]
    end
  end
  #p as

  rs = []
  ci = 0

  while ci < n
    if ! as[ci].nil?
      rs << as[ci]
      ci = as[ci][1]
    end
    ci += 1
  end
  #p rs
  #p white

  prvr = nil
  max_seq = 0

  for r in rs
    c0, c1 = r
    seq = c1 - c0 + 1

    if white
      if c0 > 0 || c1 < n - 1
        seq += 1
        if ! prvr.nil? && prvr[1] == c0 - 2
          seq += prvr[1] - prvr[0] + 1
        end
      end
    end

    max_seq = seq if max_seq < seq

    prvr = r
  end

  puts max_seq
end