レギュレーション

HACKB の評価方法、提出ステータス、ジャッジサーバーの環境、採点ルールについて説明します。コンテストに参加する前にひととおり目を通してください。

スコアリング

ランキングは問題ごとに ACとなった提出のスコアを0-100 に正規化したスコアの合計値で決まります。

1. 提出スコア (raw)

提出 1 件のスコアは評価モードごとに次のように定義されます。raw スコアは「小さいほど良い」方向の指標で、問題内ランキングはこの値で直接ソートします。コンテストランキングではこの値を 0-100 に正規化します (後述)。

評価モードraw スコアの定義方向
関数最適化モードsolve 実行中の evaluate(x) で観測された y の最小値小さいほど良い

Accepted (AC) 以外の終端ステータス (WA / RTE / TLE / MLE / IS / IE) はランキング集計の対象外です。これらの提出ではスコアが算出されません。

2. 問題内ランキング

ある問題でのユーザーの順位は、そのユーザーが同一問題に対して提出した全 Accepted 提出の中で最良 (最小) の raw スコアで決まります。複数の Accepted 提出があってもベストスコア 1 件のみがランキングに反映されます。

計算例

Optimization 問題に対する架空のサンプルです。ユーザーごとに複数の Accepted 提出があり、それぞれ異なる観測最小値 (= raw スコア) を出した場合の順位を示します。

ユーザー提出スコア (Accepted のみ)ベストスコア順位
User A0.85, 0.92, 0.780.78#1
User B0.82, 0.790.79#2
User C0.810.81#3

3. 同点の取扱い (タイブレーク)

ベストスコアが完全一致した場合、より古い提出 (先にそのスコアに到達した提出) を上位とします。コンテストランキングでも同様で、合計スコアと提出問題数が完全に同じユーザーが複数いる場合は、達成日時 (各ユーザーの per-problem ベスト提出のうち最新の時刻) が早いユーザーを上位とします。

4. 正規化スコア

コンテスト全体での順位を出すために問題ごとの raw スコアを 0-100 の正規化スコアに変換します。問題ごとに「同コンテスト内でその時点で観測されている最良スコア (running best)」を基準として相対化します。

算出方法

eps = max(1.0, (worst − best) / 100)
normalized_score = 100 × (best + eps) / (raw_score + eps)  (前提: best ≥ 0)

best / worst は同コンテスト内の running best / worst (= 全ユーザーの当該問題における raw_score の最小値 / 最大値)、raw_score は自身のスコアです。シフト項 eps は best = 0 の問題を扱うため導入されています。

running best 方式について

best と worst はコンテスト中の提出状況に応じて動的に変化します。誰かが新しい最良スコアを出すと、その問題に対する全ユーザーの正規化スコアが再計算されるため、自身の表示スコアがコンテスト中に下がる場合があります。

問題に対してAC提出が無いユーザーは、その問題分の正規化スコアが0点として加算されます。なお全ユーザーが未ACの問題はランキング集計から除外されます (誰のスコアにも影響しません)。

5. コンテストランキング

コンテストの順位は、各ユーザーの正規化スコアの合計 (= 0 〜 100 × 問題数) の降順で決まります。問題ごとの配点は均一で、追加の重み付けは行いません。同点時のタイブレークは、より多くの問題にAC提出しているユーザーを優先し、それも同じなら達成日時が早いユーザーを優先します。

計算例

3 問構成のコンテストでの架空のサンプルです。各セルは「raw スコア → 正規化スコア」を示します。User A は問題 3 未提出、User C は問題 2 未提出。正規化により全問題に挑戦している User B が首位、未提出を抱える A と C が下位となります。

ユーザー問題 1問題 2問題 3合計順位
User B
0.8596.2pt
0.40100.0pt
1.10100.0pt
296.2pt#1
User A
0.78100.0pt
0.5093.3pt
未提出193.3pt#2
User C
0.8198.3pt
未提出
1.4585.7pt
184.0pt#3