かっつのメモ帳

主に競プロ 時々日記

Topcoderの入門記事を目指したもの

(2021/02/22:追記) アクセス分析見るとこの記事が割と閲覧されていて震えている…内容が不十分なところがあると思うので時間あれば手直ししたいと思ってます。

経緯

大学の友人にTopcoderを勧めたら入門記事を求められ、折角だし自分で書くか〜という事に(探すのがめんどくさかった)

Topcoderとは

よく分からないのでTwitterで「Topcoder 最高」と検索したら

TopCoder最高!!!一番好きなコンテストサイトです!!!

というツイートが幾つか見つかりました!どうやら人々に愛されてるコンテストサイトのようです!!

(人々Topcoderの紹介する時大体、世界三大コンテストサイトで一番歴史があるとしか言わないがち)

 

アルゴ系のコンテストの略称はSRMで、よくするめと呼ばれています(他にもマラソンのコンテストもあり、MMと呼ばれています)

このTwitterBotがオススメです。

またTopcoderに限らない話なのですが、clist に世界中のコンテスト一覧がまとまっているので、こちらもまた便利です。

TCOについての説明→TCO20 - Algorithm - Rules

コンテストの開始時刻、開催頻度などは上記のTwitterBotを遡って貰えば分かると思います(大きく分けて、日本時間の20~21時・深夜1~3時・朝10時頃のイメージがある)

一時期(今も?)評判悪い話がありましたが、今実際にSRMに参加してる感想としては、そこまで嫌な感情になる訳でも特に面白い訳でもなく""普通""です。

↑って書いてたけど、今この記事書いてる時にWeb Arenaに入れなくてやっぱり凄くカスだなぁって気持ちになっています 時々なんでTopcoderにこんな感情にさせられるんだろうって嫌になるんですがこれが†本質†かもしれない

コンテストの説明

レートによってDiv1/Div2の区分が行われます。1200(青)以上がDiv1です。

f:id:KKT89:20200422175026p:plain
コンテストスケジュール

  • 開始10分前に参加登録が締め切られます。

  • 参加登録が終わると部屋に入れるようになります。(この部屋内で基本的にはコンテストが進行します)

  • 75分間のコーディングパートです。難易度の異なる3問(Easy-Med-Hardと呼ばれているのがそれです)を好きな順番で解くことが出来ます。ここでの注意点は問題文を開いた瞬間からその問題の得点が時間経過で減少し始める点です。複数回出し直すことは可能ですが得点は最終submitの時間に依拠して計算されます。

  • Topcoderはsampleが数個用意されているだけで提出時にジャッジは走らずどんな提出をしても得点が入ります(sampleすら合ってないコードを出しても得点をしてしまう点に注意してください)

  • ちなみに問題をどれか一つでも開いた時点で即ratedです。撤退は許されません。

  • コーディングパートが終わったら5分間の休憩が入ります。(ここでのTwitterで呟ける内容の線引きはよく分かっていない)

  • その後15分間のチャレンジフェーズです。ここでは部屋の全提出が公開され、その提出が落ちるテストケースを入力すると+50点(失敗すると-25点)得ることが出来ます、早い者勝ちです。(点数部分を押すと他人の提出を見ることが出来ます)

  • div2ではここが本質だったりします、仕様をよく分かっておらずsampleだけ合わせたコードやsampleすら合わないコードも転がりがちなので狙い目です(?)(可哀想)

  • これらが終わるとコンテスト終了です。爆速でシステムテストが走って順位が確定します。

コンテストに参加する方法として二つの方法があります。

  • Web Arena

  • JavaApplet

Web Arenaよりも基本的に手元での環境構築を推奨しますが、僕は(パソコンに弱く環境構築を避けて)Web Arenaでも暫く出ていたので両方の説明をします。Web Arenaでも普通に出れます。

Web Arenaでコンテストに出る

まずアカウントを作りましょう。topcoderって検索すると出てくるページの右上に大体LOGINの文字があるので、そこからjoin nowに飛んでアカウントが作成出来ます。

f:id:KKT89:20200422184255p:plain

ここからまた初見お断り感が出てしまうポイントなんですが、コンテストページどこ???問題です

f:id:KKT89:20200422200701p:plain

検索すると出てくるChallengesの方を開きます

f:id:KKT89:20200422200820p:plain

ここのCompetitive Programmingの所をクリックすると、Web Arenaに飛べます

f:id:KKT89:20200422200959p:plain

コンテスト開始前になると、この画面でregisterが出来るようになります。コンテスト中に部屋に入るのもこの画面からです。上の4つ並ぶアイコンのうち右から二番目を押すと過去問一覧を見ることが出来ます。

実際に問題を解く

Web Arena、JavaAppletどちらで出るにしろ、初めてコンテストに出る際はまず過去問を一度やってみるのを推奨します。勝手が分からないままコンテストが始まると辛いです(Web Arenaの場合はコンテスト直前にpracticeが開けなくなった気がするので注意)

 

試しにという事でTCO20 Round 1A Hard-BlindBoxSets - かっつのメモ帳この問題をやってみます

f:id:KKT89:20200423154524p:plain

このように問題が与えられます。ここでもう一つ注意点なんですが、TopcoderではAtCoderCodeforcesと異なり、標準入出力を使用しません。

クラス名とメソッド名が指定され関数の引数で入力を受け取って返り値として答えを出力する方式です(真ん中のDefinitionのところです)

なのでこの問題を例とすると、

// 必要なものをincludeする

class BlindBoxSets {
    double expectedPurchases(int numSets, int numItems){
        // 処理を書く
        return hogehoge;
    }
};

みたいな雛形コードを書いて提出する事になります。

書きあがったら下のCompileを押してコンパイルします。

f:id:KKT89:20200423155710p:plain

無事コンパイル出来たら右のTest Panelで全てチェックを入れてRun testをするとsampleが合ってるかどうかの確認が出来ます。

f:id:KKT89:20200423160004p:plain

ここまで進んで大丈夫そうならsubmitをしましょう。practiceならば横のRun System Testsをする事でシステムテストを走らせる事が出来ます。

以上がWeb Arenaでの問題の解き方になっていて、Java appletでも大まかな流れは一緒です。ただし、Web Arenaではコンパイル時に謎のWarnnigが出て提出出来ないという罠を踏む事がありがちで注意が必要です。

  • 使ってない変数がある

  • 返り値が無いと見なされる

この辺が踏みがちです、特に2個目は次のような処理を書いた時に最後の一行が入ってないと警告を吐かれた記憶があります(間違ってたらすいません)

int ans(int N){
    for(int i=0;i<N;i++){
        if(hogehoge){
            return i; // どこかで必ず答えが見つかる
        }
    }
    // がここで適当な返り値を返さないと警告が出る
    return -1;
}

あと70%ルール?(数字忘れた)(余分な使ってない部分のコードが長すぎると減点対象になり得る)というものがあるらしいですが適用された話は知る限り無さそうです。

Java appletの話

環境構築については他の人が色々書いてくださっているので割愛します

まずJava appletを入れる→TopCoderの設定 - ferinの競プロ帳

Greedというプラグインを入れるのがオススメです→topcoderのSRMでGreedに乗り換え : 備忘録 - 裏紙

f:id:KKT89:20200423162103p:plain

上のactive contestでregisterやEnterが出来ます(Web Arenaより見つけにくいので焦る)

Practice Roomsで過去問を解くことが出来ます(ちなみに過去問演習するつもりなら絶対java applet入れた方が良いです Web Arenaの過去問の使いにくさは異常)

f:id:KKT89:20200423162446p:plain

システムテスト走らせる方法も初見では苦労します、ここ開くとあります。

まとめ

まあコンテストには何とか出られると思います、楽しい競プロライフを〜