Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の4_A問題をC++で解いてみました。
ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#4では、列に対する変更を学びます。
#3から#6は、alogrithm をインクルードして利用する機能を紹介します。全てのアルゴリズムは、データ構造の実装から切り離されています。アルゴリズムの要件(主にイテレータ)を満たせば動作します。
問題(4_A: Reverse)
問題はリンク先をご覧ください。
要素の並びを逆にする reverse について学びます。
std::reverse について
以下は、cpprefjp 様の記事を参考にさせていただきました。
std::reverse は、指定された範囲の要素の並びを逆にします。
template <class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);
具体的には、0 以上 (last – first) / 2 未満の整数 i について、first + i と (last – i) – 1 を入れ替えます。正確に (last – first) / 2 回の swap を行います。
C++ プログラム例(ITP2 4_A)
配列 A が与えられて、q 個の操作が与えられます。1回の操作で指定された範囲の reverse を行います(21行目)。最後に A を出力します。
以下は、C++のプログラムです。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
int q;
cin >> q;
for (int i = 0; i < q; ++i) {
int b, e;
cin >> b >> e;
reverse(a.begin() + b, a.begin() + e);
}
for (int i = 0; i < n; i++) {
cout << a[i] << " \n"[i == n - 1];
}
return 0;
}
上記プログラムは、AOJ で「AC(Accepted=正解)」と判定されました。
最後に
reverse は、競技プログラミングでも使っていました。多くの場合、コンテナの最初から最後までを入れ替えています。reverse(a.begin(), a.end()); の形となります。
引き続き、ITP2 の問題を紹介していきます。