おはやし日記

テーマ……バイク←プログラミング←旅

寒川神社へサイクリング

先日チャリのペダルを替えたので( 自転車のペダルを替えてみました - おはやし日記 )サイクリングに行きました。目的地はなんとなく、相模国一之宮、寒川神社です。

秋晴れのサイクリング日和で、なかなか気持ち良く走れました。

samukawajinjya.jp

↑やたら重たい寒川神社のHP

行程

全体図

自宅〜戸塚

戸塚駅周辺は標高が低いのですが、周囲は山(?)なので到達するのが大変でした。

8:30頃到着

戸塚〜湘南台

戸塚駅を東から西に回り込むところで少々迷った。

戸塚からブルーライン踊場駅への長い坂がなかなかキツかったが、戸塚周辺よりは緩やかか。長後街道を道なりに進む。片側一車線なのにトラックがやたら通るので怖かった。標識に従って適当に2回左折すると湘南台駅前。

9時頃到着

湘南台寒川神社

高倉遠藤線→遠藤宮原線を進む。ここが一番気持ちよかった。湘南台から3kmほどのところで標識を見間違えたのか南に逸れてしまった。

「宇都母知(うつもち)神社入口」の交差点では、相模平野と丹沢山地、さらに富士山まできれいに一望できて感動した。

f:id:o-treetree:20200930091017j:plain

そのまま道なりに進んでいくと「寒川神社 右折」みたいな看板があるので右折。

10時頃到着

寒川神社

f:id:o-treetree:20200930084339j:plain
相模國一之宮国幣中社寒川神社

財布が「キャッシュレス」状態だったので寒川郵便局でお金を下ろす。

f:id:o-treetree:20200930085119j:plain
本殿前の門

本殿に参拝。中ではご祈祷をやっていた。

f:id:o-treetree:20200930084548j:plain
寒川神社本殿

お守りを授かる。

おみくじは小吉。

御朱印帳を買い、御朱印デビュー。コロナ云々でか、書き置きのを頂いた。

池に鯉がいました

f:id:o-treetree:20200930090253j:plain
池の鯉

相模川〜湘南海岸

11:15頃、寒川神社を後にする。

一旦右岸に渡り、相模川堤防を下る。

f:id:o-treetree:20200930091033j:plain

途中舗装が途切れ下道に降りるなどしつつ、河口へ。なんで全部舗装してくれないんや

県道134号線に入り、河口にかかる湘南大橋を渡る。車道は、一応自転車ガイドの青矢印があるし橋を渡ったあとが多少楽なのだが横風が強いし車も普通に飛ばしてるので歩道が無難。渡った先の柳島交差点は歩道橋で渡る。

その後は車道を走っていたのだがなんか速度が出ず、タイヤが地面に粘りついてる感じがしたのでサザンビーチを過ぎたあたりで歩道に退避、ポンプで空気を叩き込む。タイヤ周りも交換したいなぁ。

空気を入れたら明らかに走りが軽くなった。そのまま飛ばして12:20頃セブンイレブン茅ヶ崎緑が浜店へ。おにぎり2個とからあげ棒、麦茶を買って昼飯休憩。

海岸〜大船

13時頃、再出発。

戸塚茅ヶ崎線で藤沢駅へ。天気予報通りの北風に阻まれる。さらに適当に走って大船駅へ。

大船〜日野IC付近〜自宅

大船で記録切るの忘れてた。まあええか。

やっぱりまた山があるので大変でした。おしまい。

完走した感想

今回の荷物で一番重かったのがコンデジと思われる。写真メインじゃないならスマホでも十分な記録ができると思うが、痒いところに手が届かないというか、そんなこともある気もしてしまう……

自転車のペダルを替えてみました

こんにちは。久しぶりに更新です。今回は、自転車のペダルを交換したのでそれを記録しておきます。

というか、もともとは単にトゥークリップ(ハーフクリップ)を取り付けようかなと思っていた。

ビンディング(専用のペダルと靴でそれぞれ固定するやつ)は仰々しいというか、そんなガチで走らないし普通に街乗りもするのでクリップがいいなぁって、さらにこういうのは初めてなのでガッツリと固定もしないハーフクリップにしてみた。

交換前

写真は撮ってないので無い。完成車についてたやつなので(詳しく調べたわけじゃ無いし)メーカーもわからん。ただ、手でひねるとねっとりと抵抗を感じる。アマゾンのペダルのレビューに「ペダルを変えると軽くなる」って書いてあったのでついでに交換。

パーツ

ペダル

  • MKS(三ヶ島)シルバン ツーリング

日本製・評判がいい・べらぼうに高いわけじゃ無い ということで雰囲気でこれにしました

ハーフトゥクリップ

  • Zefal

1000円しないのでこれ。MKSの金属製のは、高いのを買ってみてクリップうまく使えんかったら嫌なので。

ペダルフリップ

  • MKS SPIN-2

これはヨドバシで買った

https://www.yodobashi.com/product/100000001002330568/

トゥクリップの重さでペダルが下向きになるのを、これ引っ掛けて戻してつま先をはめる。らしい。

交換

マイチャリはイオンバイク購入で、もうしばらく安心パックの工賃割引があるので近くのイオンバイクへ。

f:id:o-treetree:20200927212128j:plain

10分そこらで交換してくれました。ありがたや

f:id:o-treetree:20200927213656g:plain

ペダルめっちゃクルックルになって草(アップロードサイズとFPSの兼ね合いでサイズが小さい)

mstdn.jp

f:id:o-treetree:20200927212212j:plain

ペダルフリップはチャリ屋にスルーされたので自分でつけました(サドルバックに積んでたちっちゃいモンキーレンチでナットを掴んで付属の六角レンチで留めるだけなので)

その他カスタマイズ

ワイヤーリングとカラビナで、ハンドルのところにポーチを引っ掛けられるようにした

f:id:o-treetree:20200927212228j:plainf:id:o-treetree:20200927212245j:plain

セリアで買ったこれ↓つかった(4本入りですが1本使った後に撮ったので)

f:id:o-treetree:20200927212032j:plain

ここにモバブ入れればマウントしているスマホに給電できる!やったね!前はフレームのサドルあたりに安いポーチをつけてそこから2mのコードをフレームに絡ませて伸ばしていた。それよりはよっぽどいい。

換装した感想(激うまギャグ)

ハーフトゥクリップはともかく、ペダルは、今まではねっとりしたのが感じられ(る気がしてい)たのがなくなって軽くなった(気がする)。

トゥクリップも、それ自体のホールド効果はまあまあって感じだけど靴をつっかける方向に力をかけられるようになったので結果的に靴にしっかり足を入れられるようになったので良いかも

明日長距離走ってみます。それでは。


追記

モノ 代金
ペダル 3097
トゥクリップ 546
ペダルフリップ 880
工賃 550(割引)
5073

そこそこかかってるなw

最近

なんでも、入門者よりはちょいできる、くらいまでやって飽きるのが悪いクセなのだが、その例に違わず競プロも飽きてきた。グラフとか扱えるようになってきたけど、頭回すのがめんどくなっちゃった

面白いんだけどね

 

----------

 

暑さが収まってきたので(まだ暑いが)チャリに乗っている。先日は50kmくらい平地を走ったりした。もう少し涼しくならんかなぁ

 

おわり。

座標圧縮備忘録

座標圧縮、なるアルゴリズムに出会いました。どうにかわかったつもりになったので記録しておきます。自分用メモ的な精度。

座標圧縮とは

詳しくは参考のサイトを見てください。

簡単に言うと、「座標の広い範囲に散らばっている点について、その相対的な位置を変えずに狭い範囲に集める」という技です。

さらに自己流に解釈すると、「注目したい点をリスト化する」という感じだと思いました。

例えば、座標軸にいくつか($ N $個)の点を載せたいとします。点が乗っている時true、無い時falseとしましょう。$ 0 \le \rm{座標} < 10000 $ とします。

int N;cin>>N;
vector<bool> z(10000, false);
for(int i=0; i<N; i++){
  int a;cin>>a;
  z[a] = true;
}
......
//input
5
3 19 11 24 13

範囲が小さければこれで済みますが、$-10^{9} \le \rm{座標} \le 10^{9}$ とかになるとどうしようもありません。

//input
5
24680 515 -12345678 3 12345678

このとき、

value = {-12345678, 3, 515, 24680, 12345678};
index = {3, 2, 0, 1, 4};

とすれば $i$ 番目の入力はvalue[index[i]]とやって求められます。

1次元だとあんまりありがたみがないような気がしますが、2次元の領域を扱うととても嬉しくなれます。

メモリ上で実際に触る範囲が要素数オーダーに減る!

実装

とりあえず1つの配列について。

template<class T>
vector<T> compress(vector<T> &V){
  //Vを圧縮後の値にする 元の値を得るために重複削除ソート列であるSを返す
  vector<T> S = V;
  sort(S.begin(), S.end());
  S.erase( unique(S.begin(), S.end()), S.end() );
  for(int i=0; i<V.size(); i++){
    V[i] = lower_bound(S.begin(), S.end(), V[i]) - S.begin();
  }
  return S;
}
  • vector S = V;
    入力されたVはインデックスに変換してしまうので、もともとの値を(ソートして)保存しておく配列が必要

  • sort(S.begin(), S.end());
    バラバラに入力された数字をソートする

  • S.erase( unique(S.begin(), S.end()), S.end() );
    uniqueは、配列の中で重複するものの2つ目以降を配列の後ろに押しやり、その「余り物」の先頭のイテレータを返す
    eraseは、指定された範囲の要素を削除する
    結果として、重複している要素が削除される

  • V[i] = lower_bound(S.begin(), S.end(), V[i]) - S.begin();
    lower_boundで、「ソート&重複削除」された配列の中でV[i]を指すイテレータを返す
    それから先頭のイテレータを引き算することで、「何番目か」がわかる

使用例1

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

/**
 * 座標圧縮
 * */

namespace /* ZahyoComp.cpp */ {
  template<class T>
  vector<T> compress(vector<T> &V){
    //Vを圧縮後の値にする 元の値を得るために重複削除ソート列であるSを返す
    vector<T> S = V;
    sort(S.begin(), S.end());
    S.erase( unique(S.begin(), S.end()), S.end() );
    for(int i=0; i<V.size(); i++){
      V[i] = lower_bound(S.begin(), S.end(), V[i]) - S.begin();
    }
    return S;
  }
}

#define rep(i, n) for(int i=0; i<(int)n; i++)

int main(){
  int N;cin>>N;
  vector<int> input(N);
  rep(i,N)cin>>input[i];
  
  vector<int> S = compress(input);

  cout<<"compressed : RawData"<<endl;
  for(int i: input){
    cout<<i<<" : "<<S[i]<<endl;
  }
}
//input
7
100 120 120 130 115 115 150

//output
compressed : RawData
0 : 100
2 : 120
2 : 120
3 : 130
1 : 115
1 : 115
4 : 150

*/

[追記] もともと入力が入っていたinputが、「その入力が(重複削除ソートの)何番目か」を表す配列に化けていることに注意!その代わりS[input[i]]で元々の値を復元できている。

続きを読む

AtCoder M-SOLUTIONS プロコンオープン 2020 反省会 [A,B,C,D完][C++]

久しぶりの参戦。

A

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

int main(){
  int x;cin>>x;
  if(x<600)cout<<8<<endl;
  else if(x<800)cout<<7<<endl;
  else if(x<1000)cout<<6<<endl;
  else if(x<1200)cout<<5<<endl;
  else if(x<1400)cout<<4<<endl;
  else if(x<1600)cout<<3<<endl;
  else if(x<1800)cout<<2<<endl;
  else cout<<1<<endl;
}

そのまま。

B

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

int main(){
  int A,B,C,K;cin>>A>>B>>C>>K;

  while(K--){
    if(A>=B)B *= 2;
    else if(B>=C)C *= 2;
  }

  cout<<( (A<B && B<C) ? "Yes" : "No")<<endl;
}

目標は $A < B < C$ なので、そうなるように $K$ 回の間倍々にしていく。

最後の最後で、$A < B < C$ が完成していたらOK!!

C

#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;

int main(){
  int N,K;cin>>N>>K;
  vi A(N);
  rep(i,N)cin>>A[i];

  for(int i=K; i<N; i++){
    cout<<(A[i-K]<A[i] ? "Yes" : "No")<<endl;
  }
}

評点比較は例1を使うと

$$ \{96, 98, 95, 100, 20\} $$

については

$96\times98\times95$ と $98\times95\times100$ の比較 → $96$ と $100$ の比較

$98\times95\times100$ と $95\times100\times20$ の比較 → $98$ と $20$ の比較

という風に単純化できる。あとはfor文のiとか添字に気をつけて順次判定していく。

D

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
#define rep(i, n) for(int i=0; i<(int)n; i++)

int main(){
  int N;cin>>N;
  vi A(N);
  rep(i,N)cin>>A[i];
  A.push_back(0);

  ll money = 1000;

  vi list;
  for(int i=0; i<N; i++){
    list.push_back(A[i]); //今日の株価を区域に追加

    if(A[i] <= A[i+1]){
      //明日上がる
      ; //なにもしない
    }else{
      //明日下がる
      ll buy = money / list.front();
      money -= buy * list.front();
      money += buy * list.back();
      list.clear();
    }
  }

  cout<<money<<endl;
}

中心の考え方は、株価が上昇(等価含む)していく区域を見つけて、その初日で最大限買って最終日で最大限売る。これでマックスの利益が出る。

区域をlistで作ってゆき、翌日も株価が上がるならなにもしない。翌日に株価が下がるならその日が「区域」の終わりなので売買を(過去に遡って)やる。そして区域のリセットをする。

入力例1

$$ A = \{ 100, 130, 130, 130, 115, 115, 150 \} $$

区域 $\{100, 130, 130, 130 \}$ まで見て、100円で買い130円で売る処理をする

区域 $\{ 115, 115, 150 \}$ を見て、115円で買い150円で売る処理をする


なお、入力例1のように上昇したまま最終日を迎えると、「売買しなきゃいけないのに『翌日』がない」となり売買し損ねるため、「最終日」の後ろに株価が0円の日を付け加えておく。こうすると、

$$ \cdots 200, 100, 150, 0 $$

のときは最終日にlist = {100, 150}、「明日下がる」条件なので100円で買って150円で売る。

$$ \cdots 200, 150, 100, 0 $$

のときは最終日にlist = {100}、「明日下がる」条件なので100円で買って100円で売る(実質何もしない)

ちなみに、株価が下がり続けているときは、上記のようにlistに1つだけ(その日の)株価が入るので「実質何もしない」状態になる。


最初、int型でやってたらWAが出たんでlong longにしたらACなった。80日間あって $100 \le 株価 \le 200$ なので、株価が $100, 200, 100, 200, \cdots$ となる所持金が2倍になる$\times$40回 で $2^{40} \times 1000 = 1099511627776 \times 1000 \approx 10^{15}$ まで膨れ上がるんですね。

まとめ

久々だったけどDまで通ったのでまあよし。

AtCoder ABC173 反省会 [A,B,C,D完][C++]

こんにちは。ABC173でした。

ギリチョンDまで解けました。

A

A - Payment

int main(){
  int n;cin>>n;
  for(int i=0; i<20; i++){
    if(n<=i*1000){
      cout<<(i*1000)-n<<endl;
      return 0;
    }
  }
}

なんかまどろっこしいけど通るから…………

B

B - Judge Status Summary

int main(){
  int N;cin>>N;
  int ac=0, wa=0, tle=0, re=0;
  rep(n,N){
    string s;cin>>s;
    if(s=="AC")ac++;
    if(s=="WA")wa++;
    if(s=="TLE")tle++;
    if(s=="RE")re++;
  }

  cout<<"AC x "<<ac<<endl;
  cout<<"WA x "<<wa<<endl;
  cout<<"TLE x "<<tle<<endl;
  cout<<"RE x "<<re<<endl;
}

はい。

C

C - H and V

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i=0; i<(int)n; i++)

int main(){
  int H,W,K;cin>>H>>W>>K;
  vector<string> c(H);
  rep(i,H)cin>>c[i];
  int ans=0;

  for(int i=0; i<(1<<H); i++){
    for(int j=0; j<(1<<W); j++){
      
      int cnt = 0;
      for(int h=0; h<H; h++){
        for(int w=0; w<W; w++){
          if(i&(1<<h) || j&(1<<w))continue;
          if(c[h][w]=='#')cnt++;
        }
      }

      if(cnt==K)ans++;
    }
  }

  cout<<ans<<endl;
}

制約が小さいのでbit全探索しました。ijのループで行と列それぞれ消すところを指定。

例えばi=001010(2進数)のときは「2行目と4行目を消去」を表す。

hwのループで「消去する行or列はcontinue(無視)、それ以外#があったらカウント」としています。

計算量的には $O(HW 2^{H+W})$ かな?

続きを読む
プライバシーポリシー ・お問い合わせはこちら