日々精進

aikoと旅行とプログラミング

AtCoder Beginner Contest #62

問題はこちらから.

abc062.contest.atcoder.jp

問題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, greater>とかなのだろうか)

AtCoder Beginner Contest #63

問題はこちらからどうぞ.

abc063.contest.atcoder.jp

問題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

問題はこちらからどうぞ.

abc064.contest.atcoder.jp

問題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を使用するべき,
型推論

Kotlinコンパイラ型推論を行ってくれるので,

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が制式採用されることが発表になりましたね.

jp.techcrunch.com

ちょっときになったのでKotlinスタートブックを手に入れました. 最初から無理のないペースで読んでいき, メモ代わりにブログを書いていこうと思います.

第1章 Kotlinとは

kotlinlang.org

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では, 関数や変数が必ずしもクラスに属している必要はありません.
  • セミコロン不要
    セミコロンがあっても動作はします.
  • 型名は後ろに
    Array argsではなく, 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.&amp;lt;init&amp;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

問題

1862 -- Stripies

方針

  • 入力された値を降順ソートする.
  • 質量m1とm2の物体があった時,  {2*\sqrt{m1 \times 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) 参加レポート

f:id:bath_poo:20170604152244j:plain 6/2のLLRに参加したわけですが

muttan1203.hatenablog.com

チケット譲ってもらえたので6/3も参加することができました. 今回のライブツアーでは名古屋(5/20)と大阪(6/2)に参加したのですが両方共ほぼ同じセットリストだったので, もう1つのほうが聞きたくなり参加ということに. 以下ネタバレ含みます.

開演前

会場到着が16:40頃. もう先頭(1〜200ぐらい?)は進み始めてる時間です. 今回の番号は1500番代後半だったため, 入場までに結構時間がかかりました.

昨日はこれだけでチャレンジしてみた。マルチすげー。ゼップ二日目も頑張ります

Yu Sutoさん(@u_suto_)がシェアした投稿 -

たつたつさんのは昨日も載せたけど一応.

  • 6/2のときはならんだ場所が日陰だったんですが, 今回は直射日光ガンガン当たる場所だったので大変暑かった.
  • 今回はガチャガチャも物販も我慢. ただ, aikoのツイートをみてボディバッグは真剣に買うか悩んだ. (LLRではとても便利なアイテムだと思う)

開場

f:id:bath_poo:20170604081445p:plain 画像はhttp://hall.zepp.co.jp/osakabayside/より引用しました.

  • 青丸が6/2, 赤丸が今回(6/3)のおおよその位置
  • 番号的にあまり期待できないかなーと思っていたが, 意外と近い. しかもすごく余裕があるので, ゆっくり見たい人なんかは少し後ろに行っても全然いいと感じた.

セットリスト

  1. 夢見る隙間
  2. milk
  3. Power of Love
    序盤から飛ばすなーなどと思っていた. Power of Loveはライブでは初めてかな(要出典)
  4. キスが巡る
  5. なんて一日
  6. プラマイ
  7. 夏バテ
  8. アンドロメダ
  9. えりあし
  10. 雨踏むオーバーオール
  11. 恋のスーパーボール
    恋のスーパーボール久しぶりなきがするんだけど気のせいだろうか.
  12. 明日の歌
  13. beat
    自分はBABYから聞いたので, beatという曲には思い入れがあります.
  14. もっと
    もっと歌い出す時下からライトアップされるんですが, そのaikoが神か何かに見える.
  15. 舌打ち
  16. 赤いランプ
    赤いランプって今までそんなに聞いてなかったんだけど, このライブツアーで好きになりました.
  17. be master of life
アンコール
  1. 微熱
  2. Loveletter
  3. キラキラ
    キラキラで会場全体が手を振ってる光景がたまらなく好きです.
    アンコールの曲をステージ上で決めてました. 譜面をもって走るさのっち.
ダブルアンコール

  1. 鏡はライブのときのアップテンポなバージョンがいいと思う.
  2. 恋愛ジャンキー
    激アツ f:id:bath_poo:20170604082111j:plain

コールアンドレスポンス

「男子」「女子」「そうでない人」「メガネ」「コンタクト」「裸眼」「PA席」「サイドスタッフ」「照明」「警備のお兄さん」「800m走る人」「1500m走る人」「朝6時に起きる人」「朝7時に起きる人」といった感じでした.

MC

  • 名古屋公演から帰るときに, 近海強盗事件の護送と一緒になった.
  • Zepp DiverCity
    • 開場から総ツッコミ
    • Zepp OsakaCityとか色々間違えてて最終的にちゃんと言えていた
  • いとこが来てる
    • aiko「お姉ちゃん頑張るで!!!」
    • aikoがお姉さんとか楽しそう.
  • 800mと1500m
    • 6/4に陸上の大会に出る子が来ていた.
    • 800mを11:45に走って1500mを14:45に走るらしい.(頑張って欲しい)
    • っていう一連の話が1階の一部に伝わってなかったらしくaikoが1から話していた.
  • さだまさし(設楽さんがギターぶん投げたらサイドスタッフがめっちゃ焦ってた)
  • ヤリ○ン
    • aiko「最近ダブルアンコールまで普通にやるよね」
    • aiko「いやアンコールまでが本編てきなとこあるしな」
  • めっちゃリストバンドつけてくれてる方(60代)
    • aiko「どこにしまってるんですか?」おじさん「すぐ取り出せるとこにあるよ」
  • 色々な癖(へき)が出た曲
  • 昨日ライブ終わったあと, ホテルでゆずのラジオ(ANN)きいてた
    • その日に福岡でライブだったらしい
    • aiko「すごい働かされてんな」
  • 「やっぱー?」「すっきやねーん」
    • 流石にこのネタはわかったけど, 他のは全然わからなかった.
  • どやさ
  • 新曲作ってるよ

あと衣装ネタを言ってたんだけど, 残念ながら知らない方でした…

まとめ

 記事の先頭にも書いたとおり, 参加した日のセットリストがほぼ同じだったので, 今回のセットリストは全く聞いたことが無いものでした. aikoは大体2日連続しているとそれぞれ違うセットリストがくまれます. 結構違ってくきます. 個人的な感想として, アンコール前までは6/3のパターン, アンコールは6/2のパターンがいいなと感じました. ただ恋愛ジャンキーはめちゃくちゃ盛り上がってたんでそれも惜しい.
 会場は思っていたよりも空調が効いていたのか涼しく感じられました. ただ曲の最中はもちろんすごい熱気で会場は満たされていて, あまりの暑さにクラクラするほどでした. それもあってかぼーっとしがちになり, なんだか夢を見ているような気持ちでaikoを見ていました.
 aikoのライブに行くと, 辛いこととか悲しいことを(一時的ではあるのかもしれないけど)忘れて元気が出てきます. お客さんとの距離もとっても近いです. 会話だってお客さんと1対1でします. これを19年間ずっと続けていることってよく考えるとすごいことだし, これからもそんなaikoについていきたいと強く思いました.
 このライブツアー始まる前は, 申込みをしたはいいもののPOPしか行ったことない自分はどうなんだろうとか余計なこと考えてましたが, そんな心配するまでもなくめちゃくちゃ楽しいライブでした. Rockの良さである近さを十分実感する事ができたと思います. 【余談】あとプラマイを聞くと泣きそうになるのなんなんだろう. 初めて行ったaikoのライブの1曲目だからだろうか…

関係者ツイートなど

朝6時頃みんなに「おはよう」ってつぶやくわーって言ってたんですが, 本当に実行されてました.