倒錯思索ステイルメイト

愚問愚答観察。

AtCoder ARC A - Sum and Product

おはようございます。久しぶりにAtcoder触ったので思い出しがてら記事を書きます。

久しぶりなので緩めの問題です。

問題

https://atcoder.jp/contests/arc108/tasks/arc108_a

  • S, P は整数.
  •  N+M = S かつ  N \times M = P を満たす整数  (N, M) の組が存在するか判定せよ.
  •  1 \leq S, P \leq 10^{12}

解法1

というわけでこれが整数となるかどうか,つまり平方根の中身が平方数かつ分子が偶数となっているかどうかを判定すれば良いです. しかし, P が小さいときのことを考えると平方数であるかどうかの判定に O(S) くらい掛かりそうですし,そもそもC++では long long 型であっても S^{2} でオーバーフローしてしまいます.

そこで補助変数  X := \sqrt{S^{2} - 4P} を導入すると以下の議論ができます.

  •  X は整数(  \because \displaystyle{N=\frac{S \pm X}{2}} が整数).
  •  X^{2} = S^{2} - 4P より,  (S + X)(S - X) = 4P
  •  S + X,\ S - X も整数なのでこれらは  4P の約数.
  •  A := S + X,\ B := S - X とすると  \displaystyle{S = \frac{A+B}{2},\ X = \frac{A-B}{2}}

以上より, 4P の約数 A O(\sqrt{P}) で列挙・探索し, \displaystyle{B=\frac{4P}{A}}としたときに,

  •  \displaystyle{S = \frac{A+B}{2}} となるか.
  •  \displaystyle{N=\frac{S \pm X}{2}} が整数か  \Leftrightarrow  S \pm X が偶数か.

を判定すればOKです.計算量は,約数列挙の部分がボトルネックとなり O(\sqrt{P})です.

解法2

https://atcoder.jp/contests/arc108/editorial/353

......たしかに!!

問題の本質がオーバーフローの解決だと勘違いして迂遠な解き方をしてしまいましたが,制約と積の形の時点でもっとシンプルな  O(\sqrt{P}) の解法を思いつくべきでした.

解法3

ところで,解法1のように因数分解を利用するのであれば,

  •  P の約数  N を全列挙.
  •  \displaystyle{M := \frac{P}{N}} として, N + M = S かどうかを判定.

で良いことに気がつきました(え?).回り道が上手.

実装

実装1 : 解の公式からごちゃごちゃやる

#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;

// retun n の約数の集合
vector<ll> divisors(ll n){
    vector<ll> div;
    for (ll i = 1; i * i <= n; i++) {
        if(n % i == 0) div.push_back(i);
    }
    for (auto d : div) {
        if(d * d != n) div.push_back(n / d);
    }
    return div;
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    ll s, p;
    cin >> s >> p;

    vector<ll> div = divisors(4 * p);
    ll ng = 1;
    for (auto a : div) {
        ll b = 4 * p / a;
        if (a < b || (a + b) % 2) continue;
        ll x = (a - b) / 2;
        if ((a + b) / 2 == s && (s + x) % 2 == 0) {
            ng = 0;
            break;
        }
    }
    if (ng) cout << "No" << endl;
    else cout << "Yes" << endl;
    return 0;
}

実装2 :  N の取りうる値の範囲を全探索

#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    ll s, p;
    cin >> s >> p;

    int ng = 1;
    for (ll n = 1; n * n <= p; n++) {
        if (n * (s - n) == p) {
            ng = 0;
            break;
        }
    }
    if (ng) cout << "No" << endl;
    else cout << "Yes" << endl;
    return 0;
}

実装3 :  N が取りうる値として P の約数を全探索

#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;

// retun n の約数の集合
vector<ll> divisors(ll n){
    vector<ll> div;
    for (ll i = 1; i * i <= n; i++) {
        if(n % i == 0) div.push_back(i);
    }
    for (auto d : div) {
        if(d * d != n) div.push_back(n / d);
    }
    return div;
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    ll s, p;
    cin >> s >> p;

    vector<ll> div = divisors(p);
    ll ng = 1;
    for (auto n : div) {
        ll m = p / n;
        if (n + m == s) {
            ng = 0;
            break;
        }
    }
    if (ng) cout << "No" << endl;
    else cout << "Yes" << endl;
    return 0;
}

感想

迂遠な解法をやってしまうのってあまり良くないんですよね.仮にそれで解けるという確信を持ってたとしても,よりスマートな解法の方が実装がシンプルに済みがちなので(数式変形してるときには手計算によってプログラムに落とす量が減ると信じ切っているのが厄介ですが......).

最近これの類題 https://atcoder.jp/contests/abc190/tasks/abc190_dでも同じようなことをしてしまったので気を付けたいところです.

次は(僕視点で)重めの問題を何か解いて紹介できたらなと思います.それではまた.

AtCoder ABC165 C - Many Requirements

おはようございます。今日も解説記事です。

昨晩のABC165、A問題で適当を書いたらコーナー見落とすしC通せないしFでとんちんかんな考察するし散々でした。

今回は僕の他にも混乱した人が多かったであろうC問題を取り上げます。

問題

C - Many Requirements

  • 要素が 1 以上 M 以下で長さ N の非減少列 A を考える。

  • Aの得点をf(A)とすると、 \displaystyle{f(A)=\sum _ {\{i|A _ {b_i} - A _ {a_i} == c _ i \}}d_i} (i = 1,\ \dots,\ Q)

  •  f(A) の最大値を出力せよ。

  • 2\leq N\leq10
  • 1\leq M\leq10
  • 1\leq Q\leq50

解法

NM が小さいので A を全探索できないか考えます。
A としては (1,\ \dots,\ 1) から (M,\ \dots,\ M) が考えられるのでこの数列の全探索は一見 O(M^{N}) かのように見えます(コンテスト中の僕はそう思って棄却しました......)。が、これが意外と少ないんです。その理由を考えるために長さ5の非減少列の大小関係の例を少し眺めてみましょう。

  •  A_0\lt A_1=A_2\lt A_3 = A_4
  •  A_0 = A_1 = A_2 = A_3 = A_4
  •  A_0\lt A_1 \lt A_2 \lt A_3 \lt A_4

こうして見ると数列 A が非減少  \Leftrightarrow 隣接項の大小関係は '=' か '<' のみ なんですよね(当たり前だろ)。
仮に '<' による値の増加が 1 だけだとしたら各項の間にどちらの記号を入れるのかを選ぶだけなので 2^{n-1}通りです。何かいけそうな雰囲気が出てきました。
いま、値の増加は 1 だけとは限らないのですが増加量の総和は最大でも  (M-1) と小さいです。したがって同じように各項の間に記号を挟むことで非減少列を表現することを考えてみます。
まず 『間に1コ挟むごとに次の値が1増加する』 という記号"+"を導入します。"+" は(M-1) コあれば十分です(Mコ以上挟むとMより大きい値が発生して制約に反するため)。また、項の区切りを示す記号を "\#" とすると "\#" は明らかに  N - 1 コです。
これらの記号を並べるイメージについて N = M = 5 の場合の例を挙げておきます。補足ですが A の構築にあたって、 f(A) の計算式では A の特定2要素の差だけが条件になっている(値の大きさは不問である)ことから A_0 = 1 と固定して問題ありません。

  • A=\{1, 2, 3, 4, 5\}\ \Leftrightarrow\ A_0 +\# A_1 +\# A_2 +\# A_3 +\# A_4 \ \Leftrightarrow "+\#+\#+\#+\#"
  • A=\{1, 1, 3, 3, 4\}\ \Leftrightarrow\ A_0 \# A_1 ++\# A_2 \# A_3 +\# A_4+ \ \Leftrightarrow "\#++\#\#+\#+"
  • A=\{1, 1, 1, 1, 5\}\ \Leftrightarrow\ A_0 \# A_1 \# A_2 \# A_3 ++++\# A_4 \ \Leftrightarrow "\#\#\#++++\#"

このように、M-1 コの "+" と N - 1 コの "\#" を並べることで  A を網羅することができます。 これは  {} _ {N+M-2}  C _ {N-1} 通りで、  {} _ {20}  C _ {10} = 184756 くらいなので十分計算可能な状態数です。この方針によると実装1のような 2^{N+M-2} 通りの bit 全探索が可能となります。トータルの計算量は O((N+M-2)2^{N+M-2}Q) です。C++であればこれでも全然間に合います。

また実装2のように、A_{i+1} の値を  [A_i,\ M] から選んでいく再帰関数で網羅することもできます。こちらはシンプルに実装できて、計算量改善にもなっています(bit 全探索では同じ数列を表すパターンを複数回調査している場合があるはず)。 O((N+Q){} _ {N+M-2}  C _ {N-1}) です。

実装

実装1 : bit 全探索

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using vll = vector<ll>;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    ll n, m, q;
    cin >> n >> m >> q;

    vll a(q), b(q), c(q), d(q);
    for (int i = 0; i < q; i++) {
        cin >> a[i] >> b[i] >> c[i] >> d[i];
        a[i]--, b[i]--;
    }

    ll res = 0, xxx = n + m - 2;
    // 2 ^ (n + m - 2) を全探索
    for (int bit = 0; bit < (1LL << xxx); bit++) {
        vll A(n, 1);
        ll id = 1;
        for (int i = 0; i < xxx; i++) {
            // i bit目が "+"
            if ((bit >> i) & 1) {
                A[id]++;
                if (A[id] == m) {
                    for (int j = id; j < n; j++) A[j] = m;
                    break;
                }
            }
            // i bit目が "#"
            else {
                A[id + 1] = A[id];
                if (++id == n) break;
            }
        }
        ll mem = 0;
        for (int i = 0; i < q; i++) {
            if (A[b[i]] - A[a[i]] == c[i]) mem += d[i];
        }
        chmax(res, mem);
    }
    cout << res << endl;
    return 0;
}

実装2 : 再帰関数

#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;
using vll = vector<ll>;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

ll n, m, q;
ll res = 0;
vll a(55), b(55), c(55), d(55);
vll A(15);

void dfs(int id, int cur) {
        if (id == n) {
            ll mem = 0;
            for (int i = 0; i < q; i++) {
                if (A[b[i]] - A[a[i]] == c[i]) mem += d[i];
            }
            chmax(res, mem);
        }
        else {
            // A[id + 1] を [cur, m] から自由に決めることを再帰的に繰り返す
            for (int nxt = cur; nxt <= m; nxt++) {
                A[id + 1] = nxt;
                dfs(id + 1, nxt);
            }
        }
    };

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    cin >> n >> m >> q;
    for (int i = 0; i < q; i++) {
        cin >> a[i] >> b[i] >> c[i] >> d[i];
        a[i]--, b[i]--;
    }
    A[0] = 1;
    dfs(0, 1);
    cout << res << endl;
    return 0;
}

実装3 : TL でちらほら流れてきたギャグ

#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;
using vll = vector<ll>;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    ll n, m, q;
    cin >> n >> m >> q;

    vll a(q), b(q), c(q), d(q);
    for (int i = 0; i < q; i++) {
        cin >> a[i] >> b[i] >> c[i] >> d[i];
        a[i]--, b[i]--;
    }
    ll res = 0;
    vll A(10);
    for (A[0] = 1; A[0] <= m; A[0]++) {
        for (A[1] = A[0]; A[1] <= m; A[1]++) {
            for (A[2] = A[1]; A[2] <= m; A[2]++) {
                for (A[3] = A[2]; A[3] <= m; A[3]++) {
                    for (A[4] = A[3]; A[4] <= m; A[4]++) {
                        for (A[5] = A[4]; A[5] <= m; A[5]++) {
                            for (A[6] = A[5]; A[6] <= m; A[6]++) {
                                for (A[7] = A[6]; A[7] <= m; A[7]++) {
                                    for (A[8] = A[7]; A[8] <= m; A[8]++) {
                                        for (A[9] = A[8]; A[9] <= m; A[9]++) {
                                            ll mem = 0;
                                            for (int i = 0; i < q; i++) {
                                                if (A[b[i]] - A[a[i]] == c[i]) mem += d[i];
                                            }
                                            chmax(res, mem);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    cout << res << endl;
    return 0;
}

感想

黄色のお友達も落としてたしヤバい(EF を通して補ってたけど)。全探索が1010に見えると貪欲を探してパニックして終わりという問題でした。 1時間くらい詰まってる暇があったらギャグを試してみるべきでしたね。通らない考察より通る『証明:AC』!(最悪)。

AtCoder ABC137 D - Summer Vacation

こんにちは。今日も解説記事を書きます。

今回扱うのは、今朝布団の中で軽い気持ちで開いたら泥沼に嵌ってしまった400点問題です。沼ったよって言ったら周りの人も分かるって言ってたので令BC400の中ではそれなりに難しい部類と思われます(difficulty は水底くらいでした。みんなすごい)。

問題

D - Summer Vacation

  • N コの日雇いバイトがあり、それぞれ最大1回働ける。
  • 1日に1件しかバイトできない(給料が払われるまでの期間に他のバイトをすることは可能)。
  • i 番目のバイトをすると A_i 日後に  B_i の給料が入る。
  • 今日から M 日後までに入る給料の総和の最大値を求めよ。
  • 1 \leq N,\ M \leq 10^{5}

解法

  1. 1日に1件しか働けないので、毎日どのバイトをやると良いかを考える。
  2. d 日目には A > M-d のバイトをしても支払いが M 日目に間に合わないので A\leq M-d であるようなバイトが候補となる。
  3. そこで d を降順に考えると最初 (M - 1) 日目は A\leq 1 のバイトだけが候補となり、(M - 2) 日目では A\leq 2 を満たすバイトが候補となる。
    これより、d 日目で新しく A==M-d であるようなバイトを順に追加していくとその日やる価値のあるバイト候補リストを構築できる。
  4. リスト内から報酬が最大の案件を取り出せば良い。この操作は priority_queue というデータ構造を用いる1

実装

解説記事だし流石にREPマクロ排除しました()。

#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vector<ll>>;

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    ll n, m;
    cin >> n >> m;

    // mem[x] :バイトした日から x 日後に報酬がもらえる仕事の集合. 値は報酬額
    vvll mem(m + 1);
    ll a, b;
    for (int i = 0; i < n; i++) {
        cin >> a >> b;
        if (a > m) continue; // 最速で始めても M 日目に支払いが間に合わないバイトは無視
        mem[a].push_back(b);
    }

    // que : その日入れられる仕事の報酬リスト
    // mem を参照してギリ M 日目に間に合うバイトの報酬額を que に追加していく
    priority_queue<ll> que;
    ll res = 0;
    for (int d = m - 1; d >= 0; d--) {
        // mem[m - d] : d 日目に始めたらちょうど M 日目に報酬が降ってくる仕事の集合(b はその個々の報酬額)
        for (auto b : mem[m - d]) que.push(b);
        if (!que.empty()) {
            res += que.top();
            que.pop();
        }
    }
    cout << res << endl;
    return 0;
}

感想

今回は報酬の支払い日について M 日後までという締め切りがある問題でしたが、こういった期限が絡む問題は締め切りが近い後ろ側から見ると貪欲に解けたり(c.f. 区間スケジューリング問題)、この問題のように実行可能な要素の集合を良い感じに構築できたりします。切羽詰まってるときに重要度が等しい複数のタスクがあるとき期限が近いほうから処理する感覚に近い気がします。
まぁ令BC400だし貪欲でしょと考えたらドツボに嵌ったのですが。点数見て偏見で解くの良くないかも(´ー`)

それではまた!


  1. 要素が追加されたり取り出されたりする集合において、値が最大(または最小)の要素の参照や取り出しが常に高速に行える。dijkstra 法が早いのもコイツのおかげ。水色になるには知識として必要かも。

AtCoder ABC148 F - Sugoroku

こんにちは、はーさかです。

初めて AtCoder の解説記事書きます。

突然解説記事を書き始めた理由()
こないだ ABC の公式解説が行間多くて難解がちであることにお気持ち表明してたら chokudai さんからリプ飛んできてアワアワしてました。
曰く、今のABCの開催頻度を維持するため公式解説にはそこまで突っ込まないで(てか色んな人が後発で解説記事書いてくれるからその辺参照して><)って感じでした。────反論の余地、無し。
頭冷やした結果、無料コンテンツなのにクレーム入れてごめんなさいという気持ち一色になりました。AtCoder 最高!chokudai さん、いつもありがとうございます。

ということで、解説が不満なら自分で解説すればいいじゃないということでこれから暇があればちまちまやってこうかなと思います。よろしくお願いします。

問題

F - Sugoroku

 [0,\ N] の (N + 1) マス上で双六をする。1
0 から出発し N を目指す。
・サイコロの目は  [1,\ M]。出た目のマスだけ移動する。
・踏めないマスがある。
・移動回数を最小化しつつ、移動マス数を並べると辞書順最小となる移動方法を出力せよ。
・移動不可能のとき-1を出力せよ。

解法

まず、入力例2のように  1 M コ以上連続する区間が存在するとき移動不可能です。
以下移動可能な場合を考えます。
辞書順最小化を行うことから、後ろの方で大きな賽の目を出した方が良さそうなので盤面を reverse します。
各ターン、できるだけ多く移動した方が以後の移動距離を小さくできるので移動回数を減らせて損しないことが分かります。これで移動回数最小化が実現できています。

すなわち、盤面を反転してから今いるマス目を  cur としたときに出すべき賽の目  dice はmin( M,\ (N - cur)) から 1 まで降順にチェックして初めてS(cur + dice)==0 となるところと定めます。

実はこの方針を0, 1それぞれの連続数のメモも二分探索もせず愚直に実装するだけでACが取れてしまいます。2

実装

#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for(int i = 0; i < n; i++)
#define ALL(v) (v).begin(),(v).end()
 
using ll = long long;
using vll = vector<ll>;

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    ll n, m;
    cin >> n >> m;
    string s;
    cin >> s;
    reverse(ALL(s));

    // mem : '1'の最大連続数
    ll mem = 0, b = 0;
    vll a(n + 1);
    REP(i, n + 1) {
        a[i] = int(s[i] - '0');
        if (a[i] == 1) b++;
        else {
            chmax(mem, b);
            b = 0;
        }
    }

    // 到達不可能
    if (mem >= m) {
        cout << -1 << endl;
        return 0;
    }

    // res : 各ターンで出すべき目
    // cur : 現在地
    vll res;
    ll cur = 0;

    while (cur != n) {
        // dice : このターン出すべき目
        ll dice = min(m, n - cur);
        while (a[cur + dice] != 0) dice--;
        cur += dice;
        res.push_back(dice);
    }
    reverse(ALL(res));
    for (auto x : res) {
        cout << x << " ";
    }
    return 0;
}

計算量

公式解説や強い人のブログでは区間min を考えるみたいないかにも600点という内容が書かれていますが3、この問題はこのように350点程度の実装で解けてしまいます。
上述の解法が最小手数、辞書順最小の要件を満たすことは問題ないと思うので、  O(N) であることの証明を行います。

出目を決定するパートの計算量について考えます。
最悪1マスしか進めなかった場合、その決定に  M - 1dice を更新しているので一見トータル  O(NM) かと思いきやそんなことはありません。
実際、毎回1マス進めるなら踏めないマスが存在しないのでほぼ毎回  M マス進めるハズです(最後だけ調整が入るけど)。
極端な例を考えましたが、より強い主張として以下が成立します。

最適ムーブにおいて、連続する2回の賽の目の和は  M より大きい。

 t ターン目と t + 1 ターン目における出目を  d_t,\ d_{t+1} と置きます。
いま  d_t+d_{t+1}\leq M と仮定すると、 t ターン目で  d_t+d_{t+1} の目を出すことで移動回数を真に少なくできます。よって仮定のムーブは最適ではありません。

以上より2ターンあれば必ず  M マス以上進むので、問題個所トータルの最悪計算量は  \frac{N}{\frac{M}{2}} \times M で抑えられ  O(N) であることが示されました。めでたし。

おわりに

いや、これで600が解けて良いのか?という気持ちが強いのでどこか hackable なんじゃないかという疑念を込めて解説記事を投稿しました(は?)。 間違ってるところ等あればバシバシ指摘してください、お願いします。 「合ってそう」という御意見もお待ちしております。


  1. ほぼほぼ初めて Markdown 記法で書いてるんですけど tex: みたいなの使ってちまちま書いてたら大カッコが衝突してるせいかうまく表示されなくて発狂寸前。

  2. Markdown、文字色指定にhtml埋める必要があって発狂かと思いきやはてブロの標準機能にショートカットがあったおかげで耐えました。

  3. 公式解説の後半では降順走査とあるので近い考えを利用してそうですが、どのみち最小手数をメモ化しているので本解法より複雑そうです(まだイマイチ読みこめていません)(あとで別解でも解きなおします)。

AtCoder で水色になるまでに見てきた作品

 

こんにちは、harsaka です。

 

先日 ABC133 で A~E の5完を達成したことで2度目の AtCoder 水色になったことを記念してこれを書いています。やったぁ~!(^ ^)!*1

 

f:id:remagic:20190709150336p:plain

n度目の入水と言うと太宰治感ある.

f:id:remagic:20190709150513p:plain

2回あったunratedの時の成績良いんですよね~(白目)

さて、『水色になるために勉強すべきこと』みたいなのは先行記事*2で書き尽くされているので*3、僕は水色になるために見るべきアニメや漫画について書きたいと思います。

競プロerもそうでない方もぜひ読んでいってもらえたら嬉しいです!

 

 

響け!ユーフォニアムシリーズ

  • 原作:小説(武田綾乃/宝島社)
  • アニメ:1+1クール
  • 映画:4本*4
  • コミックス

 

f:id:remagic:20190422175159j:plain

顔が金賞

f:id:remagic:20190717021412p:plain

このシーン何なんだよマジで

今春新作映画が公開されたこともあってかそこそこ話題になってますね。京都の吹奏楽部の青春を描いた作品です。

登場人物の根っこの性格や吹奏楽に対する思い入れ、他の部員への繊細な感情などが緻密に描写されており群像劇としてのクオリティが高いです。さらにその部員たち全員が見据える【コンクール】という大目標に向けて個々の物語が集約されていく構造になっているため非常に見ごたえのある展開になっています。京都アニメーションによる超高水準の作画で楽しめるのも大きいです。

部活についての『本気度』による温度差だとか、努力が必ずしも成果に繋がるとは限らないだとか元来の素質の差に対する苦悩だとか競プロ(というか競技全般)に非常に当てはめやすい部分があり、主に結果が出ない時期のモチベーションになってます。イチオシです。

 

かぐや様は告らせたい~天才たちの恋愛頭脳戦~

f:id:remagic:20190716182416j:plain

アニメも良かったです。

f:id:remagic:20190716182514j:plain

そろそろこいつが【本性】現わす話が来ると思ってる

ブコメです。副題に頭脳戦とか書いてありますが基本的にキャラの頭は悪い作品で、頭脳戦っぽい頭脳戦をする場面は極めて稀です*5

特徴として、メインもサブも何かしらの弱点・欠点を晒していたり何やかんや根が善人だったりするので苦手なキャラができにくいというものがあります。また、キャラがかわいいのと作者の教養レンジが広くウィットに富んでいることもあって軽快に読み進められるのが強みです。

全体的な仕掛けとして、物語の背景に『竹取物語』があり役割やら関係性やらを紐解くメタ的ヒントになっています*6

似たようなジャンルの『五等分の花嫁』と比較されがちですが五等分の方がだいぶシリアスです。設定上向こうの方がキャラのIQ低いはずなのにかぐやの方が能天気というかぽわぽわしてるというか、ノリが軽いの面白いと思います。...五等分の話をすると宗教戦争が勃発しかねないのでここでは触れないでおきます*7

 

魔法使いの嫁

f:id:remagic:20190716184725j:plain

曲・劇伴も強かった

f:id:remagic:20190716184834j:plain

主人公が意外に表情豊か

イギリス魔法系ダークファンタジー。不幸と孤独から人生に絶望して人身売買に身を投げた主人公が【魔法使い】に拾われ、摩訶不思議な世界で第二の人生を歩むうちにこれまで悲観しかしてこなかった『第一の人生』と向き合う物語です。

音楽的・幻想的世界観と常にどこか昏い登場人物の心象風景に引き込まれること請け合いです。英国文学の教養があれば尚楽しめるようなポイントが散りばめられていたりもします。

余談ですが、アニメ版2期エンディングの『月のもう半分』という曲が『2人の人間の双対性』と『1人の人間の二面性』を歌っているんですが作品に噛み合いすぎてて震えます。

 

プリンセス・プリンシパル

  • 原作:アニメ(1クール)

f:id:remagic:20190716190420j:plain

撃たれたすぎ!!

f:id:remagic:20170821151352p:plain

顔が偉い

アニオリ。こちらもイギリスが舞台です。東西で分裂しており戦争目前の不安定な情勢のロンドンにおいて暗躍するスパイ組織のとある女子高生チームの活躍を描く物語です。

考察要素が多く、アニオリということもあってリアルタイムで見てるとき毎週めちゃくちゃ楽しみにしてました。作画が超安定してるのと劇伴がいつもの人*8なので信用ポイント高いです。また、考察要素多いと言いましたが毎回ミッションをこなしたりこなさなかったりで1話完結っぽいところもあるので意外に脳死で見ることもできるかもしれません(たま~に重い話混じってるけど)。

 

 

はねバド!

f:id:remagic:20190716190745j:plain

こいつ対戦相手煽るけど煽り耐性2なのほんますこ

f:id:remagic:20190716190837j:plain

顔芸強いやつがバド強いみたいな風潮がある

バドミントンをします。熱血係数メチャクチャ高い作品です。主に女子高生のバドの話なんですけど、試合中の主人公の顔がヤバいことで有名です。↑の画像の人が主人公らしいですよ。

普通にジャンプ漫画っぽい白熱したバトルをする一方で急に様子がおかしい狂気カットブチ込んでくるしページめくった先で何が起こるか(どんな顔芸が飛び出すか)分からないとこが面白いです。基本的に社会性に何らかの問題を抱えている選手の方がバドが強いという特徴があるんですが、唯一コミュ強かつ常識人でありながら最強の一角にいる志波姫が好きです。彼女が主人公のスピンオフ小説の存在だけ知ってるんですがまだ読めていないので買わなきゃなぁと思っています。

 

 

シノハユ the dawn of age

f:id:remagic:20190716200602j:plain

本編含めて最強格のイカサマ使い(高校生になる頃には照より強くなりそう)

f:id:remagic:20190716200724j:plain

ごめんなさい、ごめんなさい、ごめんなさい、、、

麻雀漫画『咲-Saki-』のスピンオフ作品です。本編に登場するトッププロや監督たちの青春の物語です。時系列的に過去の話なので本編を履修している必要はなく*9、単体としてオススメできる作品です。

主人公たちが小学生の頃から生活と密着していた麻雀との付き合いを日常と並行して描いており、月日の流れに従って登場人物の精神面や麻雀との向き合い方や考え方、あるいは麻雀の実力が成長していく様子を親のような気分で眺めることができます(キモすぎ)。

僕は主人公の麻雀観がとても好きで、麻雀イベントの前にはよくこれを読んで心を浄化してから試合に臨んでいます*10

 

 

 

乃木若葉は勇者である

原作:イラストノベル(原案:タカヒロ/著者:朱白あおい/イラスト:BUNBUN)

アニメ:なし。これやるとか言い出したらマジでビビるけどw

f:id:remagic:20190716201948j:plain

大天狗。かっこいい

f:id:remagic:20190716202014j:plain

酒吞童子。かっこいい

勇者シリーズ』のスピンオフ。『結城友奈は勇者である』や『鷲尾須美は勇者である』の約300年前の【初代勇者】を描いた作品。抗えない天災と戦い続ける少女たちの過酷で壮絶な物語です。

こちらはシノハユと違って本編を知ってから読んだ方が味が出る作品になっているのでまとめてよろしくお願いします。

  • まだ『勇者シリーズ』を何も見たことがない人⇒

    (『勇者の章』の前に『乃木若葉は勇者である』を読むのがベストです。)

  • 勇者シリーズ』を見たことがある人⇒貸すので今すぐ読んでください。

 

宝石の国

f:id:remagic:20190716205848j:plain

いつか救われるのかなぁ

f:id:remagic:20190716205922j:plain

こいつもまぁ救われない

ミステリバトルファンジー(???)。人類(作中では『にんげん』と呼ばれている)が姿を消して相当の年月が経った世界で活動する30弱の宝石の物語。

宝石たちを月に拉致し砕こうとする敵っぽい『月人』という存在と日々戦う宝石の日常を描く中で、『宝石や月人とは何なのか』など作品背景の謎が明かされていき、主人公(と読者)が正義がどこにあるのか分からなくなっていく話です。

性別も生死の概念すらない宝石の特質から来る『にんげん』との感覚のズレが面白いです。また、巻を重ねるごとに心身とも満身創痍になっていく主人公を応援したくなります。

アニメは3Dで宝石の光沢を見事に表現しており視覚面で漫画を圧倒的に昇華させたものとなっています。加えて、主人公役の黒沢ともよさんの演技力が凄まじいです*11。とりあえずアニメを見てもらって、面白いと思った方は漫画も手に取っていただけたらと思います。

 

 

さくら荘のペットな彼女

 

f:id:remagic:20190717015119j:plain

躁鬱病の原点

f:id:remagic:20190717015226j:plain

これの7年後、俺が歪むことになった遠因

古(いにしえ)の青春ラブコメ。97のオタクでこれを見たことないやつはいないくらいには世代を代表する名作だと思っています*12

いわゆる天才と凡人の差というテーマが徹底して描かれており、どこか陰鬱な雰囲気のアニメ2クール目を象徴する21話『誰のせいでもなく雨は降る』なんかは『凡人』を最後まで突き放す残酷なエピソードとして強く印象に残っています。

努力して努力して努力して、それでも敵わない相手がいること。色々な作品に触れたあとだと食傷気味の内容かもしれませんが、7年前そこらの自分にとってはこの作品こそが鮮烈で心臓を貫く鋭さを持っていました。脆く儚い青春の夢を見させてくれた最初の作品です。

思い出補正があるので僕は今でも見られますが、大学生がイチから見るにはラノベ原作特有のアホくさ成分を多分に含むので【本質】に突入するまで辛抱が必要かもしれません。

 

氷菓

f:id:remagic:20190716193701j:plain

この話ガチで好き

f:id:remagic:20181005121004p:plain

満天の星空を映した好奇の目、1000000点

原作は<古典部>シリーズとして知られた青春ミステリ作品。『古典部』に属する高校生4人が日常に潜む謎を解いたり解かなかったりします。

基本みんな高1とは思えないほど賢く教養がある*13*14一方で、それぞれが心に抱える年相応の悩みと向き合っていくストーリーは、かつて青春を生きてきた人間を容赦なく刺しに来ます。

短編だと画像1枚目の通り手作りチョコレート事件が好きですが、長編だとクドリャフカの順番が好きです。解決編の絶望の味が忘れられません。

アニメはシンプルに面白い原作に異様に良い作画と劇伴*15を乗せ、これが伸びないわけがないと言わんばかりの出来栄えとなっており手放しで勧められる作品になっています。

 

おわりに

まだまだオススメしたい作品はいっぱいあるのですがキリがないので今回はとりあえずこの10作ということで!気になる作品があったという方はぜひ読むなり見るなりしてください!そして良かったらどこかで感想を聞かせてくれるととても嬉しいです。

最後に、ここまで読んでくださった方、貴重な時間を割いて読んでいただきありがとうございました。それではまた!*16

*1:いや、院試勉強は?

*2:これとか割と細かく書かれていて参考になるかと思います。AtCoderで水色になるまでにやった事とかをまとめる - shibh308’s diary

*3:個人的にはとにかく過去問300~400をこなしてみると遅かれ早かれ成果は出ますとだけ言っておきます。

*4:アニメに対応する時系列の総集編的作品が2つとスピンオフ的位置づけにある『リズと青い鳥』及び新作の『誓いのフィナーレ』

*5:なお作者は賢いんやろなぁみたいに思わせられるシーンが随所にあります。日常に伏線仕込んで長編で回収するやつ気持ち良すぎる。

*6:これのために試験期間に図書館いるときに竹取の関連書籍を2,3冊開いてしまい朝から晩まで丸1日溶かしたという壮絶な過去があります。

*7:何とは言わないけど"14253"。

*8:梶 浦 由 記

*9:まぁ履修してたら知ってるキャラ登場するたびに奥歯痙攣するので知ってるに越したことはないんですが。

*10:harsaka のヒミツ ・競技麻雀サークルで麻雀を打っている ・特になし

*11:まぁいつものことですが。彼女はこのアニメ放映年(2017)に声優アワード主演女優賞を取っています。

*12:実際まだオタクじゃなかった中3の頃の俺もこれだけは見ていたし原作も読んでました。何なんだガチで。

*13:上述のさくら荘のキャラと比較すると偏差値30は違いそう。

*14:主人公に至っては老成していると言っても過言ではないくらい。

*15:シシリエンヌ 氷菓(Hyouka) OST 9. - YouTube, 解決ながらも暗然 氷菓(Hyouka) OST 43. - YouTube

*16:いや、院試勉強してね???

みんプロ2019参戦記

こんばんは、Harsakaです。

 

今回は昨晩開催された『みんなのプロコン 2019』に参加した感想を書きます。

atcoder.jp

序盤

開幕。実力(緑色)的にこういう企業コンはAB早解きまででもそれなりの価値があるので配点の低い方から逐次見ていきます。

A - Anti-Adjacency

A問題。日本語が少し怪しく一瞬困惑したのですぐにサンプルを読む。サンプルまでが問題文だと思って読むのが誤読減のキーだと思っています(そう思いながら数々の『目がついていない』系のミスをしているわけですが...)。

そういうわけで例1を読んで問題文に戻り文意を理解。Kコの整数の選び方の最善手は小さい方から全ての奇数を選択することなのでn>=2*K+1なら"YES", そうでなければ"NO"でAC。(2:24)

最近、「自明!」つって等号付近をミスってWAしたことがあったので入念にSampleを確認してたらこのくらいかかったけど5分以内ならこの方が早いので良しと考えます(ちょっと遅い気がするけど)。

 

B - Path

B問題。一筆書きなので準オイラー閉路...などと考える必要はなく、4頂点に辺が3本という条件から、次数3の点がなければ"YES", そうでなければ"NO"と単純な条件が出てきます。

証明は...

  1. nコの辺で連結可能な異なる頂点数は高々n+1コで、そのような辺の張り方は各点の次数が両端が1それ以外が2となるようなものに限られる。
  2. 今、 (辺の本数)=(頂点数)-1より1のような辺の張り方をすることが一筆書き可能の必要十分⇔端だけ次数1でそれ以外は次数2。

言語化が下手すぎるしそもそも証明になってるのかアヤシイが...まぁ無駄な辺を張らないようにすればOK(は?)。

Submission #4206426 - Yahoo Programming Contest 2019

mapで次数を調べてAC。(6:29)

 

C - When I hit my pocket...

400点問題。ビスケットを叩いて増やすかレートA:Bの交換を行うかの二択の手順を踏みビスケットの枚数を最大化するという問題。誤読が怖いのでSampleを見に行くと...。

・ビスケット 枚を 円に交換する。すぬけ君は、ビスケット 円を持っている。 

ビスケットを叩く。すぬけ君は、ビスケット 枚と 円を持っている。

 !?w

 まぁ仕様だよな...???と思いつつ読んでる瞬間に質問が飛んで行ったので見に行ってみる。

f:id:remagic:20190210195305p:plain

以心伝心?

etonagisa(大学同期)が質問してて笑っちゃった。ということですぬけくんは虚空からビスケットを生み出す錬金術師でした。

さて問題に戻りましょう。ビスケットを増やす手段は先述の通り2つあります。

  1. 無心でビスケットを叩き続ける:t回でビスケットは1枚からt+1枚に増える。
  2. A枚までビスケットを増やし、A枚のビスケットを1円に交換し、手に入れた1円をB枚のビスケットに交換する。この場合、1枚からA枚に増やすまでに(A-1)回、1円を介してA枚をB枚にするのに2回手順がかかるので合計A+1回の手順がかかる。

どちらの戦略でビスケットを増やす方が効率的かを考えます。戦略2はA+1回の手順を必要とするのでK<A+1の場合そもそも実行できません。したがってそのときは戦略1をとり最大値はK+1です。また、A+1回ビスケットを叩けば1枚からA+2枚にまでビスケットを増やせるのでB<=A+2の場合も戦略2を取る必要がなく、最大値はK+1となります。

さて、残りの場合は戦略2を取った方がいいことがわかりました。手順K回の中で何度(A+1)回の手順を踏めるかなのでfloor(K/(A+1))を計算し...

 

こうしてfloor(K/(A+1))*(B-A)+K%(A+1)みたいなことをしたら入力3に殺されます。

 

出力例より明らかに小さい値が出てパニック。型をlonglongにしてるかどうかなどチェックするも問題はなく...適当にA*Bを電卓に投げたら解答出力と同じケタの数が出てきたところで明らかに計算がおかしいと気づきます。

何で違うんだ~?とカラっぽの頭を回していると、1回目のA→B交換をした後は手元にB枚のビスケットが残っていることに気づきました(当たり前だろ)。虚空からビスケットを生むのが印象的すぎて手元にはいつも0枚か1枚しかビスケットがないみたいな固定観念があったのが敗因な気がしてます。ともかく2回目以降の交換はビスケットを叩いて増やす必要がなく、ひたすら2回叩いてB-A枚増やす作業を繰り返すだけです。最後に1回手順猶予がある場合は1回叩いて1枚増やします。

Submission #4211338 - Yahoo Programming Contest 2019

これを愚直に実装しAC。(31:12)

問題の複雑さにしては少し時間かかった気がしたけど変なWAを生やすこともなく通せたのでこの時点でまずまずの感触でした。

 

中盤・終盤(虚無タイム)

D - Ears

さてD問題(600点)。過去のAC取得点の最大値は500なのでこれを通すと金星です。

ジャイアントキリング目指し意気込んで問題を読むと...

 

 

『すぬけ君は 個の耳を持っており 1<=L<=2*10^5

すぬけ君は、座標が整数 を用いて と表される点を通るたびに、 番目の耳に石を 個入れます。

『すぬけ君の耳をひとつ選び、石を 個入れる』

『石が 個以上入っているすぬけ君の耳をひとつ選び、石を 個取り出す』

 

 ヒェッ...。すぬけ君ただのバケモノだしりんごさんはすぬけ君を蹂躙してるし何なんだコレはと震える(企業コンでこんなはっちゃけていいのかなw)。

 

設定が異様すぎて問題文に目を向けられないのでサンプルの数字を睨んで問題を解くことにしました。まずは両端。端の方に比ゼロの目標値kがあってその隣に0がmコ続く場合、散歩によってkコの石を入れたあとにその次の非ゼロ値のところにたどり着くまでにmコの目標値0の耳に1つずつ石を入れると最後にりんごさんはm回の操作を要します。一方目標値kの耳を放置してその次の非ゼロの耳から目標値に近づける散歩を行う場合、最後にりんごさんはk回の操作を要します。なのでmとkの大小を見たりすると良さそう?

しかしこれは当然両端について見るべきだったり、二つ目の非ゼロの連続とかにはどう処理するの?みたいな多数の謎が生えて僕の手には負えませんでした。

次にサンプル2と3を睨みます。サンプル2より、偶奇偶のように2つの偶数に奇数が挟まれていると散歩の仕方によらず必要な操作回数が増えるみたいな予想がつきます。

サンプル3からは端の偶奇はどうにでもなることがわかります。また、散歩の開始を、目標値が偶数の耳から始め同じ耳のポイントで終わるとすると、複数の偶数目標値がある場合もうまく最後の操作を0にできるみたいなことがぼんやり浮かびます。しかしこれも厳密にはどういう条件が働いてそうなるのかがわからず実装には全く活かすことができません。

 

いくら考えても厳密性に欠ける曖昧な予想しか出てこず、90分が経過しコンテストが終了しました。

f:id:remagic:20190210204446p:plain

感想

過去の反省からAとBを保守的に解いて0WAで通せたのはよかったです。Cはもっと早くとけたはずだし20分弱で通せば青パフォだったので頭を鍛える必要があると感じました。TLの感想戦を見るとDはDPのDをやると良かったり、順位表を見ると人々はDよりF(900)の方を通しまくっていたりと緑には見えていないものがいっぱいあるんだな~と思いました。

春休みは蟻本読んだり400の精進したりで一刻も早く水色を目指していきたいですね。読了ありがとうございました。

f:id:remagic:20190210204856p:plain

Yahooさんすき

f:id:remagic:20190210205125p:plain

Perf、ジワジワ上がっている、、のか?

 

f:id:remagic:20190210204919p:plain

いつになったら水色になるんですか?

2018年の10曲

あけましておめでとうございます。初めまして、Harsakaです(今年からHarsakaを名乗る運びになりました)。

新年初日はというと、知り合いがアポなしで下宿に突撃してきました。どうせみんな帰省しててうちに一人だったしそれは別に良かったんですがダラダラしてるうちにお腹がすいたので外に出ようとしたときにコトは起きました。

 

「いや、元日やぞ?今日は飲まず食わずで耐えようや」

 

ガチで意味が分からないことをさも当然のように言われ寒さ*1でコイツの頭がやられたのか僕の耳がイカれたのかと考えつつ、まぁ無視して行こうとするのですが。

 

「今日我慢したらいつか寿司奢るから」

 

と言われ無事断食することが決定しました。逆張り精神を拗らせた結果年に1回のハレの日に何も口にしないという実に反社会的な発想に辿り着いたらしいです。僕はそこまで拗らせていないので元日こそ真性逆張りの真似事をやらされましたが2日は初売りとかその辺の正月イベントに足を運んできました。逆の者は三が日は死んでもそういうのに出向かないらしいです。

 

余談が長くなりましたが今日は2018年の10曲をリリース順にリストアップしたいと思います。そこそこ長いですが最後まで読んでくれると嬉しいです。

 

1.月のもう半分

www.youtube.com

魔法使いの嫁の後期ED。推しの作曲家の白戸佑輔さんが作曲を務め、AIKI&AKINO from bless4さんが歌います。2/7シングルA面でリリース。

魔法使いの嫁』は、魔法使いの素質があるもののそのせいで人生が破滅した主人公のチセと、人身売買にかけられていた彼女を買い取って師匠となった魔法使いエリアスの周りで起こる事件を描く漫画原作のファンタジー作品です。イギリスのファンタジー*2から影響を受けた独特の世界観が素敵で、この曲の不可思議な雰囲気にも現れています。作中概念で魔法使いは弟子を取り二人一組でいるべきみたいな設定があるんですが、この曲の詞はず~っと『対になるもの』が歌われています。それはチセとエリアスの師弟関係のことだったり、チセやエリアス、そしてネタバレになるので名前は出せないけどある重要キャラクター個々人の内面の二面性だったりを指していることが明らかで、作品のことを知っていると月まで伸びて人間アポロになることができるのでぜひアニメも見てください。

推しのフレーズは

「誰もが自分のありのままをわからないから 教えてくれるひとにめぐり逢える」

 

2.High Energy Vacuum

凛として時雨のアルバム楽曲。6thアルバム『#5』2/14リリース。

久しぶりに出たアルバム、まぁ名盤でした。『Ultra Overcorrection』と迷ったのですがこっちの方が実に時雨らしい楽曲で、TKのセンス溢れるギターリフや急にギターの霊圧が消えるBメロ、サビ前にやりたい放題リフタイム、そしてラスサビでは発狂と「これだよこれ!!!w」ってなる一曲だったので採用しました。

奇天烈な展開が多い時雨さんですが昔よりは逆張った構成じゃなくなったなぁと感じます。アルバム内には本当に凛として時雨さんですか?ってくらい素直な進行の曲*3も入っていたりしてさらに表現の幅が広がったように思います(一曲に要素詰め込みまくるのがめんどくなっただけという説はある)。去年の時雨のツアーに都合合わなくて行けなかったの本当に悔しいです。

推しのフレーズは

「引き金引き合って 誰もが視線を撃って 自由を奪い合う」

 

3.ハルカトオク

宇宙よりも遠い場所』1, 3, 7, 9, 13話挿入歌。藤澤慶昌さん作曲でsayaさんが歌います。2/21『The Girls Are Alright!』でリリース。

宇宙よりも遠い場所、通称『よりもい』も2018年を代表する名作でしたね。自閉症多動症、コミュ障などの障害を抱え人生上手くいかない女子高生4人組が窮屈な人間社会を捨てて南極という異世界に逃避してバカ騒ぎするという非常にスカっとするストーリーでした。自身にある障害と向き合いながらもろくに解決しないので、それならいっそ別世界で自由に好き勝手やるぞという主張はまぁオタクの生き方そのものであり、日本全国のオタクが南極で4匹のイモムシになる夢を見ることになりました。

キャラの頭のネジが何本も外れてるので基本はギャグなんですが、それぞれの上手く行かない人生などの暗い過去の話があるのでところどころ本気で泣かしに来ます。そしてこの『ハルカトオク』という楽曲はただでさえ感動的な場面であるところに追い討ちをかけるかのように挿入されているので視聴時かなり印象に残るようになっています。emotionalなアコギイントロから『そっと記した夢』がスッと入ってくるやつ、ただひたすら情緒しかない。これまでの人生で度々挫折してきた主人公たちが南極に抱く切実な想いがみっちりと表現されています。

個人的には、

・出発式で4人が南極に向けてそれぞれの障害を克服しようと決意表明するシーン(STAGE07「宇宙を見る船」)

・しらせの母親の最期の言葉のシーン(STAGE09「南極恋物語(ブリザード編)」)

の2つでこれが流れてくるとこが特に好きです。

推しのフレーズは

「世界の最果てで転がっていく太陽 南風はやがて島を超えて髪を揺らす」

 

4.トリカゴ

www.youtube.com

ダーリン・イン・ザ・フランキスの初期EDで、XX:meの歌う楽曲。作曲は杉山勝彦さん。3/28シングルA面でリリース。

ダリフラは中盤まで面白いな~って見てたんですけど19話かそのへんで突如宇宙の第三勢力みたいなの出てきたあたりでついていけなくなって切っちゃいました。コード326の豹変とコード214の圧倒的不遇で毎週腹抱えて笑ってた頃が一番楽しめてましたね。

さて、この曲は一番最初のEDだったんですが、まぁイントロのヴァイオリンリフが強いので一瞬で引き込まれます*4。メロディはAメロからサビまでずっとアーフタクトでノリやすいリズムを保ちながらテンションだけジワジワ上がって行く感じになってます。サビのラインがそこまで高まらずに終わるのは、まだ序盤につき作品の随所に残っている漠然とした不安と、高校生が慢性的に抱える抑圧に対する不満を慎重に丁寧に表現していると感じます(ほんまか)。【トリカゴ】はXX:me的には自分らが住んでる環境(彼女たちは生まれつきよ~わからん閉鎖空間で教育されてきました)で一般学生的には単純に学校や学生生活による縛りを表しています。閉鎖から自由を求める構図はクリシェなんですが何度見ても見飽きません。来期アニメ化される『約束のネバーランド』も閉鎖社会系って聞いたので楽しみにしてます。

トリカゴに話を戻します。歌詞が学生目線なので背景動画においてXX:meのみなさんは作中とは全然違う現実の高校生っぽい姿になってるんですがこれが映えまくってます*5

推しのフレーズは

「夢を魅せたくせに 叶えられる才能を 与えてくれないなんて 辛くなるだけだよ」

 

5.Lonely Queen's Liberation Party

www.youtube.com

TRUEさんのアルバム楽曲。堀江晶太さん作曲。同名の3rdアルバムで4/25リリース。頭文字をとって"LQLP"と略されがち。収録元のアルバムの楽曲全部当たりなんでぜひ他の曲も聴いてください。

実はこの楽曲、2018年のアニメ『ヴァイオレットエヴァーガーデン』のOP主題歌として作られたらしいですが、石立監督と話をするなかで、華やかさよりも優しさ・慎ましさを重視することとなり「Sincerely」の方が採用されたみたいですが、このまま寝かせておくのはもったいない!ということで今回アルバムの表題曲となったようです。

nanodayo7.hatenablog.com

その過去エピソードからも華やかな曲であることは明らかで、実際イントロのピアノソロからのAメロアコースティックギター、クラッシュからのドラム、ストリングスとサビに向け楽器の数がどんどん増えていきTRUEさんのテンションも伴奏に合わせて上がっていくのは聴いてるこちらも舞い上がってしまいます。大サビへの盛り上げ方は堀江晶太さんの構成力とTRUEさんの歌唱力の賜物ですが、あそこはマジで表現力で頭を殴られる感覚がします。

2018年のTRUEさんと言えば推しの京アニ作品『響け!ユーフォニアム』の2本目の映画(届けたいメロディ)のEDが『サウンドスケープ〜Loving nostalgia Ver.〜』という2期OP『サウンドスケープ』のオーケストラアレンジでした。オケなので当然ギターではなくストリングスが伴奏で重役を担っていたのですがTRUEさんの歌声が強すぎて楽器側が少し負けているように感じました(まぁ元の曲が好きだし良かったんだけど)。しかし同じ弦メインのLQLPやSincerelyが歌と楽器の音圧の均衡取れてるのでやっぱkemuは何年経っても音圧のバケモノなんやなぁということを実感しました...。

去年はTRUEさんの単独ライブには行ったし*6宇治のコンサートでアレンジ2曲回収した上に京preでユーフォオリジナルと当時の新曲とDivine Spellとかいう古代楽曲も発見することができて無敵になりましたが堀江晶太周辺は行けなかったので今年はどっかで行きたいと思います。

推しのフレーズは

『ふれあう行間に 伝えたい理由がある 言葉で満たされた ガラスの杯』

 

6.VORACITY

www.youtube.com

アニメ『オーバーロード』3期OP。MYTH&ROIDさんの歌唱作詞作曲。7/25シングルA面でリリース。

MYTH&ROIDさん、2017年冬に初代ボーカルのMayuさんが卒業されたんですが2代目のKIHOWさんも素敵な方で2018年の楽曲も健在でした。そんな去年のMYTH曲の中で一番刺さったVORACITYですが、同作品アニタイのOxTClattanoiaっぽいな~ってのが第一印象でした(オーバーロード見てないけど)。まぁ同じ作品の世界観で両アーティストに"T"が噛んでるから当たり前っちゃ当たり前でしたね*7。低音の効いたキレの良いテクノ気味のロックに芯のある歌声、伸びないわけがないという感じです。サビで韻を踏んでるのがメチャクチャ気持ちいいです。歌詞はず~~~っと何か食ってるだけの脳筋デブソングでとても面白いです。

推しのフレーズは

「Very very tasty very 盛大に宴を 世界の全て この口腔の中」

 

7.ハイステッパー

www.youtube.com

はねバド!』のED。歌、作詞作曲すべて大原ゆい子さんです。8/15シングルA面でリリース。

はねバド!は1話冒頭の試合の作画から見入って、そのまま原作の漫画を最新まで全巻購入してしまいました。熱血スポーツ系で面白いです。主人公の羽咲綾乃が幼少のトラウマのせいでバドミントンが絡むと性格が鬼歪んで表情も顔芸を連発するようになるのがツボです。アニメも良いんですが漫画の方が試合が映えてるのでどちらかというと漫画をオススメします。試合以外のストーリーもアニメ尺用に改変されている部分が多々あって、僕は全然気にならなかったけど原作過激派にはアニメはなかったとする人もいるくらいだし追うなら原典の漫画の方が良いかなと。

さて、綾乃の内面が暗黒過ぎてJKの青春ストーリーと呼ぶにはほど遠い内容にも関わらずこの曲は爽やかな曲調です。エンディングの背景カットも平和なシーンばかりでそこだけ見るとまぁ別作品になってます。youthful beautifulと似たような感じですね。終始疾走感があり、迸る青春を歌った王道の熱血スポーツモノらしいアツい曲に仕上がってます。何で主人公が【アレ】なんだ...????w

推しのフレーズは

「明日なんて当てにしない 今やれること全部 出し切る空っぽになるまで 走り続けていたくて」

 

8.アインソフオウル with Ayasa

www.youtube.com

ASCAさんがロックヴァイオリニストのAyasaさんとコラボしたノンタイ楽曲。Pizuya’s Cellさん作曲。9/24配信シングルでリリース(Apple Musicとかで聴いてください)。

2018年で個人的に一番伸びたアーティストがASCAさんなんですけど、特徴として鋭く重厚な弦楽器サウンドとそれに負けない力強くどこかひっかかるような歌声*8が挙げられます。ネームドのプロ奏者を呼んだこの曲は特に弦の主張が顕著で、ハイテンポなのもあいまって歌もよりパワフルになっておりバカでガチ(いわゆるバチバチ)な曲に仕上がっています。京premiumライブではTシャツも買ってこの曲を待機してたんですが干されて1週間寝込みました。これ以外のA面全部拾えたから良かったんですけど。

題名の【アインソフオウル】は創世記において世界を創った無限の光みたいなモノらしく、歌詞も善悪の知識の木を連想させるモノが出てくるなどどこか神話的な内容になっています。

「傲慢な罪の色を 独りになってから知る」

「神さま どうか私に終末を」

終末を求める罪人と言えばさまよえるユダヤ*9が思い浮かんだんですが彼の罪状は西暦30年頃にならないと生えないので大サビの【光】を創世と捉えると時系列が合いません。そもそも天地創造以前に罪は存在し得ないので光は比喩で恐らく独りになった不死の罪人の救済(死)かなぁと妄想してます。不死の耀いを断ち切るのが【無限の光】なのだとしたら超カッコよくないすか?何言ってるかよく分かんないけど。

余談ですがASCAさんは、僕が中高6年間のうち唯一オタクをやっていた中3の頃に見たアニメ『さくら荘のペットな彼女』のED『Prime Number~君と出会える日~』を大倉明日香名義で歌っており、そんな彼女が5年の時を経て各クールの看板アニメのタイアップ楽曲をバスバス取るようになったのは本当に心打たれるものがあります。早くワンマンライブやってほしいです。 推しのフレーズは

「燃えあがれ火の鳥よ あなたを乗せ 星を導いて」

 

 

9.狂ったカンヴァス

JUNNAさんのアルバム楽曲。白戸佑輔さん作曲。1stアルバム『17才が美しいなんて、誰が言った。』10/31リリース。

開幕イントロで古代マヤ文明の奇祭で流れてるようなエスニックフレーズが飛んできて面白いんですが、先日ライブの爆音でソレが始まったので連番者とマヤ派の動きするやつやったところめちゃんこ楽しかったです。アウトロでは付近一帯の方々にも感染してみんなで謎の踊りを踊ってところ世界文化遺産に登録されることに成功しました。ライトアップが曲名通り狂ったカンヴァスになってたのも良かったです。

ライブで映えに映えてたけど普通に音源で聴いてもサビが白戸佑輔さんらしくグングン伸びます。

JUNNAは良いですよ。素で歌が上手いのでライブ行ったら手軽に震え上がることができます。

 

推しのフレーズは

「裏返しした好きと嫌いが騒がしいんだ わかるよだとかほんといいから 私はそんな居場所なんかいらない」

 

 

 

 

 

 

10.アツクナレ

2018年を代表するアニメになってしまった『ゾンビランドサガ』の7話挿入歌。作品内ユニットのフランシュシュの楽曲。12/21円盤特典CDでリリース。

作曲があの加藤裕介さん*10なんですが、作中で初めて聴いたときに構成がワルキューレっぽいなぁと感じてEDでクレジット見たら中身一緒だった時は心の底から楽曲派の顔つきになることができました。

さて、この曲はライブシーンでの挿入歌でありストーリーに大きく関係します。使用された7話においては音源版にはない特殊演出もあり割とそのイメージが強くこの曲の評価に影響しているので各位はゾンビランドサガを見てください。雑に言うとゾンビがアイドルする話です。1話は困惑するかと思いますが騙されたと思って見続けると後半ずっと刺さりっぱなしになる名作なのでぜひ。7話が刺さらなかったら切っていいです。

『アツクナレ』は、昭和の有名系アイドルと平成の有名系アイドルがそれぞれのアイドル哲学で大喧嘩してグズってたところこの曲のおかげで完全に和解して晴れて二人とも本来の力を出し切れるようになったみたいな曲です。1コーラス目が『分かり合えずに』から始まって例の間奏目の前の手を握ってから1サビの終わりで時代を飛び越えて(不和解消して)終わる詞の噛み合いっぷり、天才でしかない。そして2人の衝突が解決したから2コーラス目には苦悩のAパートがなくなるのも好き。音楽的には例の間奏はもちろん、Cメロのクリシェ進行からの落ちサビも気に入っています。

全く大変な曲に遭遇してしまいました。先述の通り下宿でエアコンが使えなくなっているため室内に大寒波が来ているのですが、コレ一曲聴くだけで体があったまるので暖房替わりに利用させてもらっています。

推しのフレーズは

「転んでも這い上がって 死んでも這い上がって 目の前の手を握って 時代なんて飛び越えて!」

 

あとがき

以上で『2018年の10曲』となりましたが去年は良い曲がたくさん出たのでめっちゃ悩みました。今年も楽曲派活動していけたらいいなと思います。

ここまで読んでくれた方、ありがとうございました。聴いてもらって何か刺さる曲があれば幸いです。

*1:暖房のリモコンの電池が切れたまま放置しているので室内にも寒気が吹き荒れています。

*2:不思議の国のアリスハリーポッターシリーズなど。

*3:『Tornado Minority』

*4:楽曲だけ聴いてる立場なのであまり大きな声で言えないんですが、僕が見ていない最後の方のED楽曲『ダーリン』の大サビ前の間奏でこのリフが出てくるのめちゃくちゃ好きです。

*5:このEDで何やら闇ぶった顔してるコード556さんを見て僕はコイツは絶対に伸びると周囲に喧伝してました。伸びました。

*6:会場オリジナルコーナーで『スタートライン!』とかいう曲を拾って流石にデカい声がでたw

*7:Clattanoiaの作曲はOでTは編曲。

*8:LiSAさんと分島花音さんを足して割ったイメージ。

*9:磔刑イベに向かうキリストを煽ったら死ねなくなった亡者。

*10:作曲:ラピスラズリDREAM SOLISTER、ワガママMIRROR HEEART、禁断のレジスタンス一度だけの恋ならワルキューレが止まらないなど