AtCoder Beginner Contest #62
問題はこちらから.
問題A: Grouping
#include <iostream> using namespace std; int main() { int x, y; int groups[] = {0, 1, 2, 1, 3, 1, 3, 1, 1, 3, 1, 3, 1}; cin >> x >> y; cout << (groups[x] == groups[y]?"Yes":"No") << endl; }
問題B: Picture Frame
#include <iostream> using namespace std; int main() { int h, w; cin >> h >> w; for(int j = 0 ; j < w + 2 ; j++) cout << "#"; cout << "\n"; for(int i = 0 ; i < h ; i++){ string s; cin >> s; cout << "#" << s << "#" << endl; } for(int j = 0 ; j < w + 2 ; j++) cout << "#"; cout << "\n"; }
問題C: Chocolate Bar
4種類分け方があるので, それを全部試す.
#include <iostream> using namespace std; #define int long long signed main() { int h, w; long long ans = 1e11; cin >> h >> w; for(int h1 = 1 ; h1 <= h ; h1++){ int area1 = h1 * w; int h2 = (h - h1)/2; int area2 = h2 * w; int area3 = (h-h1-h2) * w; int _min = min(area1, min(area2, area3)); int _max = max(area1, max(area2, area3)); ans = min(ans, _max - _min); int w2 = w/2; area2 = (h - h1) * w2; area3 = (h - h1) * (w - w2); _min = min(area1, min(area2, area3)); _max = max(area1, max(area2, area3)); ans = min(ans, _max - _min); } swap(w, h); for(int h1 = 1 ; h1 <= h ; h1++){ int area1 = h1 * w; int h2 = (h - h1)/2; int area2 = h2 * w; int area3 = (h-h1-h2) * w; int _min = min(area1, min(area2, area3)); int _max = max(area1, max(area2, area3)); ans = min(ans, _max - _min); int w2 = w/2; area2 = (h - h1) * w2; area3 = (h - h1) * (w - w2); _min = min(area1, min(area2, area3)); _max = max(area1, max(area2, area3)); ans = min(ans, _max - _min); } cout << ans << endl; }
問題D: 3N Numbers
どうやったらいいかわからず解説見ながら解いた(それでも最初わからないのでダメ)
#include<bits/stdc++.h> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) using namespace std; typedef long long ll; signed main(){ int n; int data[300001]; ll s1[300001] = {0}; ll s2[300001] = {0}; scanf("%d", &n); REP(i, 1, 3 * n + 1) scanf("%d", data+i); priority_queue<int> q; REP(i, 1, n+1){ q.push(-data[i]); s1[n]+= data[i]; } REP(i, n+1, 2 * n + 1){ s1[i] = s1[i-1]; q.push(-data[i]); s1[i] += data[i]; int _min = q.top(); s1[i] += _min; q.pop(); } priority_queue<int> q2; for(int i = 3 * n ; i > 2 * n ; i--){ q2.push(data[i]); s2[2*n+1] += data[i]; } for(int i = 2 * n ; i > n ; i--){ s2[i] = s2[i+1]; q2.push(data[i]); s2[i] += data[i]; int _max = q2.top(); s2[i] -= _max; q2.pop(); } ll _max = numeric_limits<ll>::min(); REP(i, n, 2*n+1){ _max = max(_max, s1[i] - s2[i+1]); } printf("%lld\n", _max); }
最後のmaxを取るところ, 添字ずれるのに気づいておらず, ずっとmax(ans, s1[i]-s2[i])で計算していて悩んだ. max(ans, s1[i] - s1[i + 1])ですね.
ところでpriority_queueって最小ヒープどうやるんだろう. いまのところ負にすることで対応しているが…(std::priority_queue<int, vector
AtCoder Beginner Contest #63
問題はこちらからどうぞ.
問題A: Restricted
#include <iostream> using namespace std; int main(){ int a, b; cin >> a >> b; if(10 <= a + b) cout << "error" << endl; else cout << a + b << endl; }
問題B: Varied
#include<bits/stdc++.h> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) using namespace std; signed main(){ string s; cin >> s; set<char> st; rep(i, s.size()){ st.insert(s[i]); } if((int)s.size() == (int)st.size()) cout << "yes" << endl; else cout << "no" << endl; }
問題C: Bugged
#include<iostream> #include<vector> #include<algorithm> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) #define pb push_back using namespace std; signed main(){ int n; cin >> n; int sum = 0; vector<int> v; int in; rep(i, n){ cin >> in; sum += in; if(in%10 != 0) v.pb(in); } sort(v.begin(), v.end()); rep(i, v.size()){ if(sum % 10 != 0) break; sum -= v[i]; } if(sum % 10 == 0) sum = 0; cout << sum << endl; }
問題D: Widespread
#include<bits/stdc++.h> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) using namespace std; typedef long long ll; int h[100001]; ll n, a, b; bool check(ll t){ ll cnt = 0; rep(i, n){ if(h[i] > b * t){ cnt += (h[i] - b * t) / (a-b); if(((h[i] - b * t) % (a - b)) != 0) cnt++; } } return cnt <= t; } signed main(){ scanf("%lld %lld %lld", &n, &a, &b); rep(i, n) scanf("%d", h+i); ll l, r, mid, ans; l = 0; r = 1e9; while(l <= r){ mid = (l + r) / 2; if(check(mid)){ ans = mid; r = mid - 1; }else{ l = mid + 1; } } cout << ans << endl; }
AtCoder Beginner Contest #64
問題はこちらからどうぞ.
問題A: RGB Cards
#include <iostream> using namespace std; int main(){ int r, g, b; cin >> r >> g >> b; cout << ((r * 100 + g * 10 + b)%4==0?"YES":"NO") << endl; }
問題B: Traveling AtCoDeer Problem
#include<bits/stdc++.h> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) #define INF 1e9 using namespace std; signed main(){ int N; int _max, _min, a; cin >> N; _max = -1; _min = INF; rep(i,N){ cin >> a; _max = max(a, _max); _min = min(a, _min); } cout << _max - _min << endl; }
問題C: Colorful Leaderboard
#include<iostream> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) using namespace std; signed main(){ int N; int cnt[13] = {0}; int a; cin >> N; rep(i, N){ cin >> a; cnt[a/400]++; } int c1 = 0; rep(i, 8){ c1 += (cnt[i] > 0?1:0); } int c2 = 0; REP(i, 8, 13){ c2 += cnt[i]; } cout << (c1==0?1:c1) << " " << c1 + c2 << endl; }
問題D: Insertion
#include<bits/stdc++.h> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) using namespace std; typedef long long ll; typedef pair<int, int> pii; int gcd(int a,int b){return b?gcd(b,a%b):a;} int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; signed main(){ int n; string s1, s2, ans; int l, r; cin >> n; cin >> s1; l = r = 0; ans = ""; int a = 0; rep(i, s1.size()){ if(s1[i] == '(') l++; else r++; if(a > l - r) a = l-r; } rep(i, abs(a)){ ans += "("; } ans += s1; rep(i, l-r-a){ ans += ")"; } cout << ans << endl; }
Kotlinスタートブックを読んでいくよ【2日目】
第4章 基本的な文法
変数と基本データ型とそのリテラル
型 | ビット幅 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
- Doubleを表現するリテラルは, 123.4e2のような形で表現することができます.
- 0xを頭につけることで16進数, 0bを付けることで2進数を表現することができます.
その他の基本形
型 | 種類 |
---|---|
Boolean | 真偽値 |
Char | 文字 |
String | 文字列 |
- Booleanはtrueかfalseの2値しかとらない
- Charは1文字を表す(シングルクォートで表す)
- Stringは文字列(ダブルクオートで表す)
変数
変数の宣言は以下のように行う.
val 変数名: 型 = 式 var 変数名: 型 = 式
- valはimmutableであるため, 1度代入した後は変更ができない.
- 再代入をしたい場合は, 変数をvarで宣言する.
- 原則として, valを使用するべき,
型推論
val name: String = "d(^_^o)"
という記述は,
val name = "d(^_^o)"
と書くことができる.
様々なオブジェクト
文字列
- 文字列はimmutableである.
- Stringリテラルは, ダブルクオートで囲った0文字以上の文字列のこと.
- 以下のようなメソッドが定義されている.
名前 | 仕様 |
---|---|
length | 文字列の長さを返す |
capitalize | 1文字目を大文字にして返す |
isBlank | 空白 or 空文字であるかを判定する |
- 文字列リテラル内に${式}と記述することで, その場所に式が評価された値が埋め込まれる.(Stringテンプレート)
- ダブルクオーテーション3つ(“”“)で囲むことで, raw stringとなる.
- raw string内でもStringテンプレートは使用可能である.
- raw stringでは, 先頭に|を置いて目印にすることが多い.
""" | aaaa | bbbb | cccc """.trimMargin()
trimMargin()は, |をエスケープする.
fun String.trimMargin(marginPrefix: String = "|"): String (source)
配列
配列はクラスArrayで表現される. - 配列の生成方法
val arrays = arrayOfNulls<Int>(5) // デフォルトの値がNullの要素数5である配列 val strs = arrayOf("aaa", "bbb", "ccc") // 引数に指定した要素を持つ配列を生成する
- 配列のサイズは, プロパティsizeを使用する.
arrays.size // => 5
- 添字は0-indexである.
- ボクシングのオーバーヘッドが気になる場合は, intArrayOfのような関数を使うと良い.
リスト
- リストは順序付きのコレクション. listOfで生成.
val ints: List<Int> = listOf<Int>(1, 2, 3) println(ints.size) // => 3 println(ints[2]) // => 3
- リストは要素の変更はできない. 通常のListはimmutableである.
- mutableなリストは, MutableListというインタフェースで表現される.
val ints: MutableList<Int> = mutableListOf(1, 2) ints[1] = 3 println(ints) // => [1, 3]
セット
セットは集合を表すコレクション
val im_set: Set<Int> = setOf(1, 2, 2, 3, 3, 1) println(im_set) // => 1, 2, 3 val m_set: MutableSet<Int> = mutableSetOf(1, 2, 2, 3, 3, 1) m_set -= 2 println(m_set) // => 1, 3
- セットは順序関係がないため, インデックスでのアクセスはできない.
マップ
マップはキーとそれに対応する値を保持するコレクション
// MutableMap<keyの型, valueの型> val m1: MutableMap<String, Int> = mutableMapOf("one" to 1, "two" to 2) println(m1) // => {one=1, two=2} println(m1.size) // => 2 println(m1["one"]) // => 1 m1 += "three" to 3 // 要素を追加 println(m1) // => {one=1, two=2, three=3}
- mapに格納する値は, Pairオブジェクトである必要がある.
- Pairオブジェクトは,
to の形式で生成可能.
とりあえず今日はここまで. (P55)
Kotlinスタートブックを読んでいくよ【1日目】
先日行われたGoogle I/OでKotlinが制式採用されることが発表になりましたね.
ちょっときになったのでKotlinスタートブックを手に入れました. 最初から無理のないペースで読んでいき, メモ代わりにブログを書いていこうと思います.
第1章 Kotlinとは
Kotlin(ことりん)とは, あのIntelliJ IDEAやWeb Stormなどで有名なJetBrainsが開発している言語です. いわゆるJVM言語であり, JavaとKotlinの相互運用性は100%だそうです. Javaよりも簡潔に記述することができ, 安全なコードを記述することができるのも特徴と言えるでしょう.
第2章 Kotlinを始める
最初のプログラム
こういうときのお決まり, Hello world!からKotlinの特徴を見てみる.
package sample fun main(args: Array<String>){ println("Hello, world!") }
- 関数がクラスに属していない
Kotlinでは, 関数や変数が必ずしもクラスに属している必要はありません. - セミコロン不要
セミコロンがあっても動作はします. - 型名は後ろに
Arrayargsではなく, Array argsです. - 関数定義はfun
第3章 Kotlinガイドツアー
有理数クラスを作る過程を通してKotlinの雰囲気をつかんでいきます. 有理数クラスってなんか聞いたことあるなと思ったら, Scalaスケーラブルプログラミング(通称コップ本)のやつでした.
有理数クラスの定義
まずはRationalクラスを定義していきます.
class Rational(val numerator: Int, val denominator: Int)
- クラス名の後ろに定義されているコンストラクタを, プライマリコンストラクタと呼ぶ.
- 変数名の後ろに, valもしくはvarを書くことでプロパティになる.(プロパティとは, getter, setterとfieldが合わさったようなもの)
- valはimmutable, varはmutableな変数である. 実際にインスタンス化して試してみる.
class Rational(val numerator: Int, val denominator: Int) fun main(args: Array<String>) { val half = Rational(1, 2) println(half.numerator) // 1 println(half.denominator) // 2 }
numeratorとdenominatorはvalで宣言されているため, 以下のようなコードは実行できません.
class Rational(val numerator: Int, val denominator: Int) fun main(args: Array<String>) { val half = Rational(1, 2) half.denominator = 2 // denominatorはimmutableなため }
メソッドの定義
オブジェクトの文字列表現を返すtoStringは標準では「クラス名@ハッシュ値」であるため, これを意味のある文字列を返す関数に書き換える(Overrideする)
class Rational(val numerator: Int, val denominator: Int){ override fun toString(): String = "${numerator}/${denominator}" } fun main(args: Array<String>) { val half = Rational(1, 2) println(half) // 1/2 }
- メソッドシグネチャ = hogeというのは, メソッドの戻り値がhogeであることを示しています.
- 文字列リテラル内の"${…}“という表現は, 波括弧内の式を評価し埋め込む機能(Stringテンプレート)です.
イニシャライザ
初期化ついでに何か行いたいときには, initブロックを活用します. 今回は分母が0の場合に例外をスローする処理を書いていきます.
class Rational(val numerator: Int, val denominator: Int){ init { require(denominator != 0, {"denominator must not be null"}) } override fun toString(): String = "${numerator}/${denominator}" } fun main(args: Array<String>) { val half = Rational(1, 2) println(half) }
- requireは, 第一引数がfalseのときに, IllegalArgumentExceptionがスルーされる関数. この関数で以下のようなコードを実行すると
class Rational(val numerator: Int, val denominator: Int){ init { require(denominator != 0, {"denominator must not be null"}) } override fun toString(): String = "${numerator}/${denominator}" } fun main(args: Array<String>) { val half = Rational(1, 0) }
次のようにエラーとなります.
Exception in thread "main" java.lang.IllegalArgumentException: denominator must not be null at Rational.&lt;init&gt;(Simplest version.kt:8) at Simplest_versionKt.main(Simplest version.kt:14)
非公開プロパティとメソッド
続いて, 約分を実装していきます. 約分は分母と分子のgcdでそれぞれを割れば良いです.
class Rational(val n: Int, val d: Int) init { require(d != 0, {"denominator must not be null"}) } private val g = gcd(Math.abs(d), Math.abs(n)) val numerator = n / g val denominator = d / g override fun toString(): String = "${numerator}/${denominator}" tailrec private fun gcd(a: Int, b: Int) = if(b == 0) a else (b, a%b) } fun main(args: Array<String>) { val half = Rational(55, 100) println(half) // 11/20 }
- tailrecは末尾再帰最適化処理
実行すると, 11/20と表示されます.
演算子オーバーロード
有理数同士で演算できたら嬉しいので, その機能を実現するメソッドplusを実装します.
class Rational(val n: Int, val d: Int) init { require(d != 0, {"denominator must not be null"}) } private val g = gcd(Math.abs(d), Math.abs(n)) val numerator = n / g val denominator = d / g override fun toString(): String = "${numerator}/${denominator}" tailrec private fun gcd(a: Int, b: Int) = if(b == 0) a else (b, a%b) fun plus(that: Rational): Rational = Rational( numerator * that.denominator + that.numerator * denominator, denominator * that.denominator ) } fun main(args: Array<String>) { val r1 = Rational(1, 4) val r2 = Rational(1, 2) println(r1.plus(r2)) // 3/4 }
- Rationalはimmutableなので, plusメソッドでは新たなRationalインスタンスを生成して返している点に注意.
先程よりは便利になりましたが, r1 + r2のように書くことができたらなお便利になりそうです. そこで演算子のオーバーロードが活躍します.
operator fun plus(that: Rational): Rational = Rational( numerator * that.denominator + that.numerator * denominator, denominator * that.denominator )
メソッドplusに修飾子operatorを付けることで, r1 + r2のような演算を実現することができます.
fun main(args: Array<String>) { val r1 = Rational(1, 4) val r2 = Rational(1, 2) println(r1 + r2)) // => 3/4 }
オーバーロードに対応するメソッドシグネチャは予め決められている. (a-bはa.minus(b)とか)
メソッドのオーバーロード
メソッド名は同じであるが, 引数の型や数が異なるメソッドを複数定義することをオーバーロードと言います. 先ほどの計算では, Rational + Rationalでしたが, Rational + Int(たとえばRational(1, 2) + 1)を実現できたら嬉しそうです. そこで, 次のような関数を追加します.
operator fun plus(n: Int): Rational = Rational(numerator + n * denominator, denominator)
これで, Rational(1, 2) + 1のような演算を実現することができます.
拡張関数
Rational + Intの演算は前の節で実現できたが, 1 + Rationalは実現できていない. しかし, レシーバーであるIntにはそのようなメソッドは実装されていないため実際はできません. そこで, 既存のクラスやインスタンスを拡張する拡張関数(extension function)を定義してあげてこの機能を実現します.
operator fun Int.plus(r: Rational): Rational = r + this
拡張関数を使うとクラスを継承することなく機能を追加できるというわけですね.
最終的なコード
class Rational(n: Int, d: Int){ init { require(d != 0, {"denominator must not be null"}) } private val g = gcd(Math.abs(d), Math.abs(n)) val numerator = n / g val denominator = d / g override fun toString(): String = "${numerator}/${denominator}" tailrec private fun gcd(a: Int, b: Int): Int = if(b == 0) a else gcd(b, a % b) operator fun plus(n: Int): Rational = Rational(numerator + n * denominator, denominator) operator fun plus(that: Rational): Rational = Rational( numerator * that.denominator + that.numerator * denominator, denominator * that.denominator ) } operator fun Int.plus(r: Rational): Rational = r + this fun main(args: Array<String>) { val r1 = Rational(1, 4) val r2 = Rational(1, 2) println(r1 + r2) println(r1 + 1) println(1 + r1) }
本の方だと, numeratorやdenominator, gがlazyになっていた.
private val g by lazy { gcd(Math.abs(d), Math.abs(n)) } val numerator: Int by lazy{n / g} val denominator: Int by lazy{d / g}
lazyはlambdaをとるっぽい.
今日はここまで(P38まで読んだ)
【POJ 1862】Stripies
問題
方針
- 入力された値を降順ソートする.
- 質量m1とm2の物体があった時, で求められるので, これを先頭から順にやっていく.
コード
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<ctime> #include<cctype> #include<climits> #include<iostream> #include<string> #include<vector> #include<map> #include<list> #include<queue> #include<deque> #include<algorithm> #include<numeric> #include<utility> #include<complex> #include<memory> #include<functional> #define rep(i, n) REP(i, 0, n) #define REP(i, a, n) for(int i = a ; i < (int)n ; i++) #define ALL(v) v.begin(), v.end() #define pb push_back using namespace std; signed main(){ int n; vector<int> v; int in; scanf("%d", &n); rep(i, n){ cin >> in; v.pb(in); } sort(ALL(v), greater<int>()); double ans = v[0]; REP(i, 1, n){ ans *= v[i]; ans = 2 * sqrt(ans); } printf("%.3f\n", ans); }
aiko Live Tour Love Like Rock Vol.8 Zepp Osaka Bayside(6/3) 参加レポート
6/2のLLRに参加したわけですが
チケット譲ってもらえたので6/3も参加することができました. 今回のライブツアーでは名古屋(5/20)と大阪(6/2)に参加したのですが両方共ほぼ同じセットリストだったので, もう1つのほうが聞きたくなり参加ということに. 以下ネタバレ含みます.
開演前
会場到着が16:40頃. もう先頭(1〜200ぐらい?)は進み始めてる時間です. 今回の番号は1500番代後半だったため, 入場までに結構時間がかかりました.
【LLR8リポート10】
— aiko official (@aiko_dochibi) 2017年6月3日
大阪公演2日目💪今日も宜しくお願い致します!
刺繍の入ったボディバッグは髪型や服まで忠実にaikoを再現しています!愛用中のスタッフも多数👨👩👧👦
皆さんも夏フェスやちょっとそこまで〜なお買い物にも是非aikoをお供させて下さいね✨by.スタッフ pic.twitter.com/fp9fM1xype
LLR8zepp大阪Bayside。外は意外と涼しいです。今日から2日間よろしくお願いします♪(๑ᴖ◡ᴖ๑)♪ pic.twitter.com/mx40slWIwA
— 佐藤達哉 (@satotatsua) 2017年6月2日
たつたつさんのは昨日も載せたけど一応.
- 6/2のときはならんだ場所が日陰だったんですが, 今回は直射日光ガンガン当たる場所だったので大変暑かった.
- 今回はガチャガチャも物販も我慢. ただ, aikoのツイートをみてボディバッグは真剣に買うか悩んだ. (LLRではとても便利なアイテムだと思う)
開場
画像はhttp://hall.zepp.co.jp/osakabayside/より引用しました.
- 青丸が6/2, 赤丸が今回(6/3)のおおよその位置
- 番号的にあまり期待できないかなーと思っていたが, 意外と近い. しかもすごく余裕があるので, ゆっくり見たい人なんかは少し後ろに行っても全然いいと感じた.
セットリスト
- 夢見る隙間
- milk
- Power of Love
序盤から飛ばすなーなどと思っていた. Power of Loveはライブでは初めてかな(要出典) - キスが巡る
- なんて一日
- プラマイ
- 夏バテ
- アンドロメダ
- えりあし
- 雨踏むオーバーオール
- 恋のスーパーボール
恋のスーパーボール久しぶりなきがするんだけど気のせいだろうか. - 明日の歌
- beat
自分はBABYから聞いたので, beatという曲には思い入れがあります. - もっと
もっと歌い出す時下からライトアップされるんですが, そのaikoが神か何かに見える. - 舌打ち
- 赤いランプ
赤いランプって今までそんなに聞いてなかったんだけど, このライブツアーで好きになりました. - be master of life
アンコール
- 微熱
- Loveletter
- キラキラ
キラキラで会場全体が手を振ってる光景がたまらなく好きです.
アンコールの曲をステージ上で決めてました. 譜面をもって走るさのっち.
ダブルアンコール
- 鏡
鏡はライブのときのアップテンポなバージョンがいいと思う. - 恋愛ジャンキー
激アツ
コールアンドレスポンス
「男子」「女子」「そうでない人」「メガネ」「コンタクト」「裸眼」「PA席」「サイドスタッフ」「照明」「警備のお兄さん」「800m走る人」「1500m走る人」「朝6時に起きる人」「朝7時に起きる人」といった感じでした.
MC
- 名古屋公演から帰るときに, 近海強盗事件の護送と一緒になった.
- Zepp DiverCity
- 開場から総ツッコミ
- Zepp OsakaCityとか色々間違えてて最終的にちゃんと言えていた
- いとこが来てる
- 800mと1500m
- 6/4に陸上の大会に出る子が来ていた.
- 800mを11:45に走って1500mを14:45に走るらしい.(頑張って欲しい)
- っていう一連の話が1階の一部に伝わってなかったらしくaikoが1から話していた.
- さだまさし(設楽さんがギターぶん投げたらサイドスタッフがめっちゃ焦ってた)
- ヤリ○ン
- めっちゃリストバンドつけてくれてる方(60代)
- aiko「どこにしまってるんですか?」おじさん「すぐ取り出せるとこにあるよ」
- 色々な癖(へき)が出た曲
- 昨日ライブ終わったあと, ホテルでゆずのラジオ(ANN)きいてた
- その日に福岡でライブだったらしい
- aiko「すごい働かされてんな」
- 「やっぱー?」「すっきやねーん」
- 流石にこのネタはわかったけど, 他のは全然わからなかった.
- どやさ
- 新曲作ってるよ
あと衣装ネタを言ってたんだけど, 残念ながら知らない方でした…
まとめ
記事の先頭にも書いたとおり, 参加した日のセットリストがほぼ同じだったので, 今回のセットリストは全く聞いたことが無いものでした. aikoは大体2日連続しているとそれぞれ違うセットリストがくまれます. 結構違ってくきます. 個人的な感想として, アンコール前までは6/3のパターン, アンコールは6/2のパターンがいいなと感じました. ただ恋愛ジャンキーはめちゃくちゃ盛り上がってたんでそれも惜しい.
会場は思っていたよりも空調が効いていたのか涼しく感じられました. ただ曲の最中はもちろんすごい熱気で会場は満たされていて, あまりの暑さにクラクラするほどでした. それもあってかぼーっとしがちになり, なんだか夢を見ているような気持ちでaikoを見ていました.
aikoのライブに行くと, 辛いこととか悲しいことを(一時的ではあるのかもしれないけど)忘れて元気が出てきます. お客さんとの距離もとっても近いです. 会話だってお客さんと1対1でします. これを19年間ずっと続けていることってよく考えるとすごいことだし, これからもそんなaikoについていきたいと強く思いました.
このライブツアー始まる前は, 申込みをしたはいいもののPOPしか行ったことない自分はどうなんだろうとか余計なこと考えてましたが, そんな心配するまでもなくめちゃくちゃ楽しいライブでした. Rockの良さである近さを十分実感する事ができたと思います.
【余談】あとプラマイを聞くと泣きそうになるのなんなんだろう. 初めて行ったaikoのライブの1曲目だからだろうか…
関係者ツイートなど
大阪ライブ4日目終わりました!ありがとうございました!楽屋に戻っても汗が止まらなくて汗を見ながら
— aiko official (@aiko_dochibi) 2017年6月3日
「あ...水あめみたいやなー」と放心の中ボーッと思った私はあしたのジョーでした。
本当にありがとう🥊😊 pic.twitter.com/hMQ7PTUD8q
aikoさんLLR8、個人的千秋楽終わりました。いろいろアホみたいに楽しかったです。ありがとうございました。またどこかでー。 pic.twitter.com/mW2Wso6pZa
— 浜口高知 (@hamaguchi0301) 2017年6月3日
おはまちゃん、本当に本当に本当にありがとうございましたー!!!最高だった。
— aiko official (@aiko_dochibi) 2017年6月3日
おはまちゃんとても格好良かったです!
ひとり千秋楽かよー置いていくなよー!
でも、頑張るからね୧( "̮ )୨✧︎ありがとう!
aikoさん〜!ありがとうございました!この2日間の思い出を噛み締めながら、おはまはこの先も頑張れます…。このあとも最高のツアーになりますように!!!
— 浜口高知 (@hamaguchi0301) 2017年6月4日
大阪2日間。熱いライブ後に心地よい浜風🐚最高の夜をありがとうございました😊 pic.twitter.com/rkXzD4qfJt
— 佐藤達哉 (@satotatsua) 2017年6月4日
朝6時頃みんなに「おはよう」ってつぶやくわーって言ってたんですが, 本当に実行されてました.
おはよう😚
— aiko official (@aiko_dochibi) 2017年6月3日