プロローグ
学校でプログラミングを教えて貰ったけど、C言語で何が出来るって言うんだ!
となっている人が多いので、素晴らしい道場を紹介しよう
決してC言語をけなしている訳ではありません
競プロ is 何
説明は省略します。プログラミングで課題を解決しよう!ってやつ
if, for, while, 配列 の概念が分かればとりあえず出来るのでご安心ください
AtCoderについて
基本的に問題を解くのは ABC(AtCoder Beginner Contest)の問題です。
ABCは毎週土曜日(たまに日曜日)に開催されています
難易度一覧
- A問題 => 学校の授業を理解してれば解ける
- B問題 => 学校で習った知識だけでも頑張れば解ける
- C問題 => 若干数学の知識が無いと解けない
- D以降 => めっちゃ難しい!
もしもレートを上げることに興味があるなら、午後9時から開催されるコンテストにリアルタイムで参加しましょう。
参加回数が10回だったか15回だったかぐらいまでは中々レートが上がらない仕様になっているので、予定が合わなくてもとりあえず参加登録しておいた方がいいです。
競プロに触れよう
①必要な準備
AtCoderのアカウント作成
このページでアカウントを作って、AtCoderにログインしてください。
C++でプログラミングをするための、最低限必要な準備を行います。
- VSCodeのインストール
Macユーザー
こちらの記事を参考に、Homebrewをインストールしてください。
インストールが完了したら、
brew install gcc
を実行してください。
次に、c/c++コンパイラをMacデフォルトのClangからGCCへ変更します。
2025/04/30時点では、上記でインストールされるバージョンがgcc14なので、-14と入力します。
おそらくもうすぐ15になるので、ダメだったら-15にしてみてください。
ln -s /opt/homebrew/bin/g++-14 /opt/homebrew/bin
ln -s /opt/homebrew/bin/gcc-14 /opt/homebrew/bin
VSCodeへの拡張機能のインストール
(たぶん必要ないやつも混じってる…)
どこかに競プロ用のディレクトリを作っておいてください。
Windowsユーザー
- VSCodeへの拡張機能のインストール(ホストOS)
開いたら、そのままこれを右クリックでペースト、Enter
wsl --install
処理が終了したら、再起動。
しばらく待つと、自動で何か立ち上がります。
これが新しく作られた仮想環境(Ubuntu)です。
「ユーザー名とパスワードを設定しろ」と言われます
適当に入れてください。
パスワード入力中は文字が表示されませんが、仕様です。
パスワードはちゃんと覚えておいてくださいね!
次に、これを右クリックでペースト、Enter
パスワードの入力が求められます
sudo apt-get update
処理が終わったら、これをペースト、Enter
sudo apt-get install build-essential gdb
c++のビルドツールとデバッグツールをインストールしました。
次に、プログラミングを行うディレクトリ(フォルダ)を作成、移動します。
mkdir kyopro
cd kyopro
mkdir practice
cd practice
VSCodeを開きます。
code .
これで、ホストOSでVSCodeが起動するはずです。
このフォルダー内のファイルの作成者を信頼しますか?
と聞かれるので、「はい」を押してください。
VSCodeへの拡張機能のインストール(Ubuntu側)
WSL:UBUNTUと書いてある側でこれらをインストールしてください。
(手順の通りなら勝手にWSL側にいます)
②最低限必要な知識を知ろう
言語
参加するには何でもいいですが…
可能ならC++を使いましょう!
解説はほとんどC++です!
また、python, JavaScript等、動作が遅い言語だと正答が不可能になる問題もあります。
よって、ここではc++で解説を進めていきます。
ほとんどCと一緒です。
違うところはちゃんと解説するので安心してください。
入出力
入力は、
cin >> 変数;
Cのこれとか一緒です。
scanf("%d", &a);
出力は
cout << 内容;
Cのこれとか一緒です。
printf("%d",a);
cin, cout 等を使うには、本来
#include <bits/stdc++.h>
をする必要があります。
これは、C++の標準機能ではない、あったら便利なツール集と思ってください。
C++をpythonみたいに使えるようになります。
また、使用時は、このように書きます。
std::cin
ですが、
using namespace std;
を先頭に付けることによって、省略することができます。
例
この問題の場合、
#include <bits/stdc++.h>
using namespace std;
ll N;
cin >> N;
vector<ll> P(N);
for(int i=0; i<N; i++) cin >> P[i];
って書きます。
llとかvectorとか書かれてるけどそんなこと今はどうでも良くて…
cinする度に「空白」または「改行」の次の値を読み取る!
ってことが分かればOKです!
出力
出力するものが1つの場合は、
cout << 変数 << endl;
複数出力する必要があるときは、
for(int i=0; i<N; i++) cout << " "とか"\n" << ans[i];
cout << endl;
この問題の場合は、僕ならこう書きます!
bool flag = true;
for(int i=0; i<N; i++){
if(flag) {
cout << ans[i];
flag = false;
}
else cout << "\n" << ans[i];
}
cout << endl;
たいてい、
N M
A A ... A
って形で入力データが与えられます。
データ型
日頃プログラミングを学習する上でよく使うのは
int, char, float, double とかだと思います。
でも、競プロはこれだけじゃ足りないんです…
例
1 ~ 1,000,000,000,000,000,000 の整数Nが与えられるそうですね
整数型なのでint型を使って…
2^{16} = -32768 ~ 32767 ≒ ±10^{4}
全然足りない!
実は、もっとデカい値を使える型があります!
競プロでよく使う型は long long int型です。(long longと省略可能)
表示可能範囲はlong long型で、
2^{64} = -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 ≒ ±10^{19}
"競プロにおいては"データ型が大きくて困ることは無いので、整数型の変数は基本的に long long型を使う癖をつけましょう!
(B問題ぐらいの難易度でテストケースのACが13/18とかになるときは、intを使っているせいでオーバーフローしていることが多いです…)
使い方はこんな感じ!
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ll N;
cin >> N;
}
③問題を解こう
公式チュートリアルに沿って、進めていきましょう。
まずはこのページにアクセスします。
スクショが出せないですが、「参加ボタン」を押してください。
すると、「問題」というタブが追加されます。
選択して、「Welcome to AtCoder」をクリックしてください。
問題はこちらです。
とりあえず愚直に書いてみましょう!
VSCodeで「tutorial.cpp」という新しいファイルを作成してください。
このファイルにコーディングします。
回答のヒントを置いておきます。
「tutorial.cpp」にこれをペーストし、回答してください。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main(){
//変数の宣言(ll型でa, b, c, sumを用意)
//変数の宣言(string型でsを用意)
//入力
cin >> >> >> >> ;
//計算(a+b+cをsumに代入)
//出力
cout << << << << ;
return 0;
}
模範解答
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main(){
//変数の宣言(ll型でa, b, c, sumを用意)
ll a, b, c, sum;
//変数の宣言(string型でsを用意)
string s;
//入力
cin >> a >> b >> c >> s;
//計算(a+b+cをsumに代入)
sum = a + b + c;
//出力
cout << sum << " " << s << endl;
return 0;
}
テスト
コードが書けたら、それが合っているのか確認する必要がありますね!
VSCode上でF5を押します。
するとこのようなものが出てくると思うので、
「g++ アクティブファイルのビルドとデバッグ」を選択します。
すると、こんな感じになります。
なんかすごいことになってますが問題ありません!
右の「ターミナル」を選択します。
今は、入力待ちの状態です。
続いて、問題のページからサンプルテストケースをコピー、ペーストします。
ペーストした結果がこちら
入力したデータのすぐ下に出力結果が表示されます。
もう一つも確認します。
正しそうですね!
(なんかいっぱい文字が出てきたあの画面は、最初にF5を押したときしか出てきません)
提出
AtCoderに提出して、サンプルテストケース以外を含む、全てのテストケースで正しいことを確認しましょう。
これを「AC」といい、ACのみがその問題の正解です。
提出したコードのステータスには、他にもこのようなものがあります。
https://atcoder.jp/contests/abc074/glossary?lang=ja
大抵、サンプルが正しいことを確認してから提出するはずなので、よく見るのは「WA」と「TLE」です
ちなみに、ABCでいうC問題からよくTLEを見ます。
TLEは、論理的には間違っていないけど、コンピューターが計算するとしても途方もない時間がかかるからダメ!
っていうプログラムです。
そうならないようにどんなアルゴリズムにする必要があるのか考えることが、本来の競プロの醍醐味だったり。
さて、話が逸れましたが先ほどのコードを提出しましょう!
今開いている「問題」の右のタブにある、「提出」を押して、このページに移動してください。
言語は「C++ 20(gcc 12.2)」を選択してください。
書いたコードを提出欄に貼り付け、提出します。
勝手にこの画面に遷移します。
ACと出ているので正解ですね!
ちなみに、過去に同じコードをPythonでも書いて提出していますが、実行時間に大きな差があることが分かると思います。
Pythonは実行が遅いため、すぐTLEになってしまうのでオススメされていません。
④第二の環境構築
毎回ディレクトリを用意して、ファイルを用意して、テストをコピーして貼り付けて…
ってやるの面倒くさい!
AtCoderをもっと楽にできるツールがあるので紹介します!
ディレクトリはどこでもいいので、これらを実行してください。
sudo apt install python3
sudo apt install python3-pip
pip3 --version
Command 'pip3' not foundって出なければ大丈夫です。
pip3 install online-judge-tools
pip3 install git+https://github.com/online-judge-tools/oj
oj --version
Command 'oj' not foundって出なければ大丈夫です。
作業したいディレクトリに移動します。
Windowsユーザーなら、今作業しているディレクトリが
home/USER/kyopro/practiceのはずなので、
cd ../
でいいと思います。
以下を実行します。
git clone https://github.com/aiutarsi/AtCoder-Directory.git
chmod +x first.sh
./first.sh
cd AtCoder-Directory
code .
こんな感じになるはずです。(ちょっと余分なファイルがあります)
新しいファイルを作成で、
「.clang-format」を作成し、以下をペーストしてください。
BasedOnStyle: Google
BreakBeforeBraces: Attach
IndentWidth: 2
AllowShortIfStatementsOnASingleLine: Always
AllowShortElseIfStatementsOnASingleLine: Always
AllowShortElseStatementsOnASingleLine: true
AllowShortElseStatementsOnASingleLine: true
このファイルは、フォーマットを指定するためのものです。
使ってみれば、ルールが分かるはずです。
例えば、
for (int i=0; i<=N; i++)
{
cin >> A[i];
}
が
for (int i = 0; i <= N; i++) {
cin >> A[i];
}
こうなります。
なんなら、こういうコードなら
for (int i = 0; i <= N; i++) cin >> A[i];
これでいいです!
一旦VSCodeを閉じます。
cd ABC
code .
今度はこんな感じになると思います。
template.cppを開いて、これをペーストします。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
// format維持用コメント
return 0;
}
次はこの問題を解いてみましょう。
この問題は、ABC81、B問題の出題なので、
./init.sh 81
を実行します。
色々出てきました。
新しいディレクトリ「abc081」が作成されました。
cd abc 081
VSCodeで、abc081_b/abc081_b.cppを開き、このファイルにコーディングを行ってください。
今回も、回答のヒントを置いておきます。
abc081_b.cppにペーストしてください。
Cとはかなり違う書き方をするので、解法を思いついたのに書き方が分からないという場合は、すぐに模範解答を確認してもらっても構いません。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
// format維持用コメント
// 変数の用意(初期化を忘れない!)
// Nの入力
// 大きさNの配列Aの用意
// Aに値を入力
for ()
// 無限ループ
while () {
// A[0] ~ A[2]の各要素に対して操作を行う
for () {
// もし当該要素が奇数なら、
if () {
// すぐに結果を返し、
// 実行を終了する
}
// 当該要素を÷2する
// A[2](最後の要素)まで到達できたら、操作が行える回数が+1
}
}
}
回答出来たら、こちらを実行してください。自動でサンプルテストケースのテストをしてくれます。
bの部分は、B問題ってことです。A問題なら、aにしてください。
./do.sh b
こんな感じで、SUCCESSと出たら、提出しましょう!
提出方法は、チュートリアルの問題と一緒です。
模範解答
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
// format維持用コメント
// 変数の用意(初期化を忘れない!)
ll N, ans = 0;
// Nの入力
cin >> N;
// 大きさNの配列Aの用意
vector<ll> A(N);
// Aに値を入力
for (int i = 0; i < N; i++) cin >> A[i];
// 無限ループ
while (true) {
// A[0] ~ A[2]の各要素に対して操作を行う
for (int i = 0; i < N; i++) {
// もし当該要素が奇数なら、
if (A[i] % 2 == 1) {
// すぐに結果を返し、
cout << ans << endl;
// 実行を終了する
return 0;
}
// 当該要素を÷2する
A[i] = A[i] / 2;
// A[2](最後の要素)まで到達できたら、操作が行える回数が+1
if (i == 2) ans += 1;
}
}
}
この写真は初期化を忘れたコードでテストした結果ですが、間違えてるとこんな感じになります。
ちゃんと間違いの出力結果も表示してくれます。
「test」ディレクトリを見ると、サンプルテストケースが用意されていることが分かると思います。
内部的には、ここのファイルを入力することで、テストを自動で行ってくれています。
(本当は、ターミナルから提出できる機能があるのですが、なんかぶっ壊れてるので使えなくなってます…)
便利なサイトの紹介
最後に、AtCoder Progressを紹介します。
右上の「login」からAtCoderのアカウントにログインすると、
こんな感じで、自分の解いた問題、解いてない問題が、一目で分かるようになっています!便利!
使用したサイト、参考URL
MacにHomebrewをインストールする方法
https://qiita.com/wooooo/items/6d8a7de5ffafed1cc66c
AtCoder用C++開発環境 (Mac編)
https://spiralray.sakura.ne.jp/blog/cp/devenv-cpp
競技プログラミングの環境構築 [VSCode+WSL+AtCoder Library]【ゆっくり解説】
https://www.youtube.com/watch?v=uhnASau7fB4&t=781s
practice contest
https://atcoder.jp/contests/practice
online-judge-tools/oj
https://github.com/online-judge-tools/oj
How to Install oj command
https://github.com/online-judge-tools/oj/blob/master/docs/INSTALL.ja.md
AtCoder-Directory
https://github.com/aiutarsi/AtCoder-Directory