第1回オンラインハッカソンに参加してきた!!

Ruten主催第一回オンラインハッカソンに参加してきました!

今まで参加したハッカソンの中でまじで一番楽しかった。これまじ

ハッカソン概要

リモートワーク時代に必要になるツールをテーマにチーム毎にプロダクトを考え、制作物を作り、オンラインで発表する(Zoomを使った)。

自己紹介

チーム名は賞金で二郎一生分食べたい です。

僕らは去年の夏、某F社のサマーインターンで出会いました。インターンで結構仲良くなって、インターン中も後も結構交流してました。

成果物

Cheers!ってアプリです。知らない人と気軽にオンライン飲み会できるアプリです。

話題を選んで、部屋を作るor入るなどをしてテレビ通話をすることができます。4人までテレビ通話できます(4人が一番会話が弾みそう)。

f:id:ziroppe:20200525192706p:plain
Cheers!

デプロイ先のリンクは下です↓ cheers.reud.net

GitHubのレポジトリのリンクは→ https://github.com/yuziroppe/we_wanna_eat_Jiro

使用技術・環境

  • SkyWay (通話機能, P2PSFU技術を利用しています)
  • Cloud Firestore (DB)
  • Firebase Authentication
  • Vercel (CI構築)
  • git/github (バージョン管理)
  • now (デプロイツール)
  • Next.js (SSR)
  • Typescript

これはreudのブログからパクりました。

開発の感想

開発がめっちゃ楽しかった!!信頼できるチームメイトはマジで偉大!

皆さんかなり強強で、開発がとんとん拍子に進んで楽しかったです!!二週間でこんだけコミット数あるのエグい(コメントがreudのパクリになっている気がするが気にしない)

f:id:ziroppe:20200525200029p:plain
commit数

なんでこんなに開発が楽しかったか振り返ってみます。

1. アプリ仕様に関する手戻りがなかった

最初にそこそこしっかりアプリの仕様を決めたため、アプリをピポットするみたいなことが全く無く機能に関する意思疎通が取りやすかった。

2. お互いにめっちゃ質問しあえた

しっかり認識できなかった部分に対して、自分が理解できるまでお互い質問しあえたため、仕事を始めるとき認識間違いがほぼなかった気がする。

3. タスクの粒度、誰にタスクを投げるかがちょうどよかった

これは自画自賛的なこともあるが(自分が仕事の割り振りを結構決めることが多かった)、仕事をお願いする側、お願いされる側で双方向で議論してタスクをうまく切り分けできた気がする。

あと、それぞれお互いが得意な技術における仕事を投げれた気がする。 例えば、reudの場合はFirestore周り、チーム開発手法に関する知見、たかひろさんはFirebase Authenticationやプレゼンテーション、デザイン周り、自分はNext、React特有の技術周りが得意だった。

4. 皆開発が早い!!

チームメイトが非常に優秀なので、開発スピードが皆早く、どんどんと機能が出来上がっていくのがとても楽しかった。 どんどん新しいプルリクが出て、レビューをし、masterにマージするペースが本当に早かった!!

5. ペアプロ、コードレビューで見つかる新たな発見

自分一人でコードを書いていると乗り越えられない壁も、仲間となら乗り越えられる。これまじ

実装に詰まっているときは、それを早めに伝えてペアプロorプルリク書いてレビューをもらうができたのが大きかった。

実際に今考えている実装方針を仲間に伝えるともっといいやり方を仲間が教えてくれたり、がお互いにできた気がする。

詰まっても議論することで新しい発見が得られて壁を乗り越えられた気がする!!

6. 技術選定

TypeScript, Next.jsを導入し、バックエンドをFirebase(Authentication, Firestore)を利用したことで開発スピードが爆速だった気がする。

ESLint, Prettierを途中から導入して、コードに統一性が取れたのも大きかった。

デプロイもgit pushしたら自動で完了されるようになったし(Vercelまじで神)、ハッカソンにうまく合った形で開発できた気がする。

開発で大変だったこと

1. SkyWayの通話周り

SkyWayのSDKを用いて、複数人テレビ電話を実装したわけですが、Peer(ルーム参加者)が入るとき、抜けるときの処理が大変だった。

最初の方は、誰かが部屋を抜けるとうまくMediaStreamを受け取れなくなって、エラーを吐いてサーバが落ちたりとか色々あった。

コンポーネントのライフサイクルを意識して、通話画面に入ったら自動でPeer通信できるように実装するのがマジでムズかった。

また、JSにおけるSkyWayの通話ロジックと競合せずに最高のデザインを仕上げてくださったたかひろさんにまじで感謝でいっぱいです!!

2. 部屋に入るor抜けるときのDB処理周り

これはまじでreudが神だった。

彼がルーム入退室におけるDB処理をほぼすべて書いてくれた気がする。

結果

入賞できた!3位を頂きました!!

f:id:ziroppe:20200525201503p:plain
3位!!

周りがかなりレベルが高い中入賞できたのはかなり嬉しいです!!

他のチームへの感想

みんなつええ...

Zoomにニコ動みたいに字幕をつけるアプリケーションを作成するチームがあって、やべえ...となりました。

また、相手側のスマホで映像のある場所にタップすると、現実世界でタップされた場所にレーザーポインターが指されるシステムを作るチームもいて、自分たちではできないアプローチで面白いアプリを作っているチームがいて感心しました。

交流の時間もめっちゃ楽しかったです!!

ハッカソンに対する良かった点、改善希望点はreudとほぼ同じなので飛ばします。

最後に

一緒にハッカソン完走してくださったチームメイトに感謝でいっぱいです。

次もISUCON頑張ろうな

(追記) Gitの鬼、権化になりてえ...

AtCoder水色になりました!

久しぶりです. yapattaです.

今回ABC160で水色になったので変色記事を書きたいと思います. 

1年ぐらい緑で停滞しましたがなんとか水色コーダーになれました. 水色になりたい人の励みになればいいなと思っています. 

すべて鵜呑みにせず, 必要なところだけ参考にしていただければ幸いです.

自己紹介

競プロやっている人の中では初期スペックが化け物みたいで参考にならない人もいるので, 自分のあらすじでも書きます(自分と似た状況の人がいれば幸いです).

情報系の学科の新3年です(2020年4月から). プログラミングは一度高校一年のときにC言語を勉強してみたのですが, ポインタ周りがわからなくて挫折しました. 大学受験後もう一度真面目にプログラミングをやってみたいなあと思って, C言語の入門書とかを大学一年の最初にかじりました. 競技プログラミングについては大学一年の6月あたりに予備校の友人に勧められて大学で週一回やる競プロの活動に行き始めました. 大学一年の11~12月あたりから真面目にAtCoderに参加して螺旋本を読むようになった気がします.

大体こんな感じです.

では次に実際勉強したこと, 精進内容について書きたいと思います.

勉強したこと

勉強したアルゴリズムとか

  • GCD, LCM
  • DFS, BFS
  • しゃくとり法
  • 二分探索
  • IMOS法
  • 素数列挙(エラトステネスの篩とか)
  • 二項係数(フェルマーの小定理, 逆元など)
  • UnionFind木
  • 最小全域木(Prim法, クラスカル法)
  • DAG(トポロジカルソート, 閉路検知とか)
  • ダイクストラ, ワーシャルフロイト, ベルマンフォード
  • DP(普通のDP, 桁DP, BitDPとか)
  • LCP(Suffix Array, ローリングハッシュ, Z Algorithm)
  • 拡張ユークリッド
  • セグメント木, 遅延伝搬セグメント木(とりあえずどう動くかわかるぐらい, 群の話は自信ない)
  • BIT
  • 最大流(Ford Fulkerson法)(これも理解した程度)

こんな感じな気がします(たぶんもっと細かく言えばきりがないかも).

精進について

精進グラフ, 精進量はこんな感じです(詳しくは僕のID: ziroppeで検索してください).

f:id:ziroppe:20200329005436j:plain

f:id:ziroppe:20200329011558j:plain

f:id:ziroppe:20200329011630j:plain

自分の勉強方法

最近1ヶ月は主にABCの水色diff(たまに青diff)を1日一問ほど埋めていました.

自分のレートより少し上の問題を無理のない程度に解くと自分の実力アップに良い気がします.

問題の解き方としては,

一時間ほど考えて実装する → WAだが思いつきそうならもう少し考える, 疲れたか諦めたかACしたなら答えを見る

みたいな感じです. 問題を解く時間が長すぎると集中力もモチベも続かないため, 今の実力で解けるか解けないかぐらいの問題を選ぶといい気がします. あと何時間もじっくり考えるというよりは, 空いている時間に解法を考えるとかのほうが個人的に良い気がしました.

あと解説を見るときに, その問題の解法を複数見て理解するように(できれば実装)する(例えば, ABC141Eの解法ではDP, Z Algorithm, ローリングハッシュなど複数解き方がある), などが実力アップに良さそうです. 絶対解きっぱなしにしちゃいけない気がします(全く手に負えない問題なら放置するのもありです).

個人的な精神論のお話

これは人によると思いますが, 僕はある特定期間に熱烈精進するよりは, 生活にバランスを取って精神が辛くならない程度に毎日少しづつ精進するようにしたら競プロが楽しくなって, パフォーマンスも高く出るようになった気がします.

個人的に精神の安定は最も大事な気がします. 周りのレートがどんどん上がっていく中, 自分のレートが停滞したり下がったりすると焦りますし, 自信もなくなると思います. 実際それで苦しめられた時期がありました(去年の秋頃). そういう中でもマイペースに自分のレベルに合った問題に取り組み, 競プロの時間をコンスタントに持つことで少しずついい方向に進んでいく気がします.

もしくは競プロが辛くなったら思い切って休むのも手な気がします. 僕は2ヶ月ほど休んだら気が楽になって競プロが楽しくなってきました.

まあともかく楽しんで取り組むのが一番だと思います!

最後に

これからも楽しく競プロに取り組みたいですね. 実際, 競技プログラミングをやっていることでたくさんの出会いがありましたし普通じゃできない体験もできたと思います. 競プロと出会って本当によかったです. 今年もICPCの本戦に出れるように頑張りたいですね.

必見!毎日筋トレを休まずにやる方法

こんばんは, yapattaです.

僕が大学で所属しているサークルでAdvent Calenderを書くことになったのですが, 現在技術的なことを記事にするモチベがあまりないため精神論的な話をしたいと思います.

 

今回はとあるメソッドを試したところ筋トレをする習慣が何故かついたので, ライフハック的な意味も込めてこの記事を書くことにしました. これを見た方達が筋トレを続けられるになったら幸いです.

 

でも僕の状況は大分局地的な状況であるため, こういう状況になる必要がないなら絶対になんない方がいいと思います. 

 

ちなみに筋トレについてはあまり書いていません(は????????????)

 

事の発端

家の給湯器の調子が悪くなった. 昼間はお湯が出るが, 寒い日の夜はお湯が出たと思ったら少し経って給湯器がエラーを吐いて, お湯が出なくなった. 

 

まだ当時は, たまにお湯が出なくなるだけかー, 風呂に入る時間をずらせばいいやー, と軽く考えていた. しかし, このままでは終わらなかったのだ....

 

段々と昼間もお湯が出なくなったのだ. 昼間ですらお湯が出たと思ったら, 1分後には給湯器がエラーを吐いて, お湯が出なくなったのだ. 最近寒くなってきて水道管が凍って給湯器が故障したのかな?と思ったが, 気温もマイナスとかにはなっていないから別の理由による給湯器の故障だと思われる.

 

とりあえず大家に伝えたところ, 点検業者を手配するとのことでとりあえず安心した. しかし, 最近寒くなってガスの故障が各地で相次ぐせいで点検業者が忙しいらしく, 実際に家に来て点検するのが一週間後とかになってしまった. さらに, 今回は家に来て動作点検とかをするだけで, 部品交換とかの根本的な故障の場合復旧するのにさらに時間がかかるらしい. 

 

中々のブチギレ案件である. このトンデモナク寒い冬の時期に家のお湯が使えないんだぞ...

風呂にも入ることができねえんだぞ...

大家も真顔でご了承下さいとか言ってたけど, 全然ご了承できねえよ!!

多分, こういう状況に大家も慣れているのか

 

まあ, こんな感じの事情があって, 毎日シャワーを浴びるor風呂に入れるように何かしらの手を打たないといけなくなったのである. 

 

とりあえず2日ほど友人の家に行ってシャワーを借りたりして持ちこたえたものの, さすがに毎日シャワーを借りていたら友人にも迷惑がかかる(貸してくださった友人, まじでありがとう).

 

何か手はないかなぁと考えていた. 

そんなとき, 俺は自分が通っているジムにシャワーが備え付けられていることを思い出した.

それは今年の5~6月頃に契約したジムだった. 新しくOPENしたいうことで, 入会費無料, 2ヶ月利用料無料という謳い文句で会員を募集していた. 高校のとき筋トレが好きだったのと, 二ヶ月無料はかなりお得, 家から10分だからまあ通えるか, という安直な気持ちで入会を決断した.

しかし, まあ筋トレはあまり習慣化せずに1週間に1回というペースで通ってしまっていた. さらに11月に風邪を引いてしまいそこから行くのが途切れてしまったという状態だった. 

お金が勿体ないし行かなきゃと思いつつも一度行かなくなったが最後, 面倒くさいなあという状態が続いた. 

 

家の給湯器が止まったのはちょうどこんなときだった.

これを機に, 毎日ジムに通ってトレーニングをして, シャワーを浴びればいいのでは!と思った. シャワーも浴びれるし筋トレの習慣もつくし, これは一石二鳥なのでは!!

我ながら天才だと思った. 俺はよく自分を天才だと勘違いするのだが, このアイデアは逆境をも自分の強みにする中々いいアイデアなのではないかと思う.

 

実際に続けてみて

毎日筋トレをするわけだから, そりゃ毎日体が痛くなる. 最近は足を引きずって大学に通っている. しかし運動すると, 寝付きが段違いに良くなるし首や腰が強くなったのか, パソコン作業をやっても肩も腰も痛くならない. 筋トレの時間を考慮して課題も計画的にやれるようになるし意外といいのでは!と思っている. まあこんな感じで, パソコンカタカタやっている人に結構筋トレをオススメします!

 

けど...

まあこんな感じで, 筋トレを勧める記事をそれっぽく書いたわけですが(ほぼ自分の日記になったが), 早く自宅の給湯器が直ってお湯が出て欲しいと切実に思います. 毎日, 深夜家を出て筋トレをするのは結構負担になります. 

 

あと賃貸を借りるとき, 築年数が古い, 値段の割に部屋が広いみたいなアパートは危険です. 何が起こるかわかりません. 実際, 僕が住んでいるアパートでは, 給湯器が壊れる以外にも, 台風のとき雨漏りするみたいな現象も起きました.

自分の賃貸のじゃじゃ馬的な感じに愛着が湧くこともありますが(あるのか??), 関わんなくていいトラブルは回避した方がいい気がします. 

 

今回はこんな感じで記事を終わりにしようと思います. 最後まで見て下さった方々ありがとうございます. 

ICPC Asia Yokohama Regional 2019の感想記

 

 

こんばんは, yapattaです. 

11/16から11/18にかけて, ICPC Asia Yokohama Regional 2019に参加してきましたー!

せっかく参加できたわけですし感想を書きたいと思います. 

 

今年も, 去年と同じチームメイト, Roy_R, spiderとチームchoKOdaiとして参加しました. 

結果はABの2完, 54/65位でした. 最下位にならないという目標は達成しましたが, 3完したかった...(H問題解きたかった...)

アジアの壁の高さに圧倒されました.

 

では, 今回のICPCについて時系列順につらつらと書き出していきたいと思います.

 

 

準備

平日授業が終わった後Roy_Rと, 1時間ほど時間を決めて, ICPC本戦の過去問を解く練習をやっていました. 一人がキャンパスが違かったり, 研究室見学で忙しかったこともあり, 3人で5時間とって本番のように練習する機会が取れませんでした. しかし, JAG夏合宿で5時間ぶっ続けのコンテストを何回か練習でき, 本番の雰囲気を知れたことは大きかったと思います. 

余談なのですが, コンテスト前日に寝坊して, 大学の実験に遅刻して受けることができなくなっちゃいました. 遅刻した理由として, ICPCに緊張しすぎて寝れなかったと言い, ICPCのせいにしてしまったこと, 誠に申し訳ありません...(でも, 本当に緊張したんですよ?)

因みに, あと一回実験を受けられないと落単ですね... 恐ろしい...

 

一日目

コンテストのリハーサルやチーム紹介をしました. 

 

会場に向かう途中, 最寄り駅で大学の友人に会って応援されました. うれしかったと同時に, これからICPCに行くんだなということを強く実感しました. (それまで, 本当に今日大会があるという実感が湧いていなかったらしい)

会場に着いて, Registrationをしました. 話される言語が全部英語だったんですね. アジア大会に来てしまったんだなあ, と感慨深くなりました. 

大学の友人がスタッフアルバイトをしていたり, JAG夏合宿で見たことある人がたくさんいたおかげで, 会場の雰囲気に呑まれずに済みました(非常にありがたかった).

 

主催者が全て英語で話していたから, これ聞いてたら勝手に英語力上昇しねえかなー, とか思いながらOpeningを過ごしました. 

その後, Judgeの説明などがありました. スタッフが試しにJudgeに簡単な問題の答えをsubmitしたらWrong Answerが出て, 会場が大爆笑になりました. コンテストで起こりうる事例を色々試してくれて非常にありがたかったですね. 

 

そして説明が終わった後, コンテストのリハーサルが始まりました. 問題内容をあまり覚えていませんが, C問題で再帰が何故か抜けなくなって解けなかった気がします. 最終的に, A, B問題が解けました. 

本番環境のエディタにもコンパイラにも悩まされることがなく安心しました. 

 

続いてチーム紹介が始まりました. チーム紹介について事前に何も打ち合わせをしていませんでしたが, チーム名がchoKOdaiということもあり, chokudaiさんのハンドスプリングにあやかって, Roy_Rが側方宙返りをすることに決まりました. 僕がとりあえずそれっぽい説明をして, 彼がパフォーマンスをやりました. 結構受けました. Roy_Rありがとう. 一番の関門を突破して安堵感でいっぱいになりました. (因みにまだ本番は終わっていない)

 

まあこんな感じで一日目が終わりました. 

家に帰る途中に近所の公園で配布された弁当を食べました. 秋の公園にいると, とりあえず心が落ち着きます. 

 

帰宅後, ABC145に参加しました. (AtCoder社のコンテスト) D問題を見て, フェルマーの小定理やんけ. 脳死で解けるぜ!とか思ったのですが, 再帰を深くしすぎて,PCがSegment Faultを吐いたんですね. E問題も最後の処理を付け加えたナップザック問題だろうという感じで思いついたものの実装しきれなくて, 結局4完遅解きみたいな感じになっちゃいました. まあ, そんな日もあります. 

コンテストの後, 幾何ライブラリの使い方を確認し, 印刷して翌日に備えました. 

 

二日目

朝の集合時間が非常に早かったため起きれるか心配になりました. (朝に非常に弱いのです...)

しかし, 目覚まし時計 + スマホのアラーム + 友人に朝電話をかけてもらう, という万全の体制で朝起きることに成功しました(電話かけてくれて本当にありがとう...).

 

なんとか会場に着き, 登録を終えることができました. 二日目の開会式が終わったら, すぐにコンテストが始まり焦りました(高田先生も時間を間違えてのんびり話してしまったらしいです).

まず, Roy_RとspiderにA問題を見てもらい, 僕がB問題を見ることになりました. A問題について僕はあまり良くわかっていないため, Roy_Rのブログを参考にして下さい. 

roy-r.hatenablog.com

彼らがA問題を40分ほどで解いてくださりました. 彼らが解いている間に, 僕はB問題の問題文を読んでいました. 高さがわかっている座標からどんどん広げて, 取りうる高さの範囲を求めるのかな?と思いつつ, それで本当に正しい答えが出るか確証が持てないという状態でした. Roy_R曰く, その範囲の最小値を出力していけばいけるらしく, 二人でコードを書き出すことにしました. 各点かDFSでやろう → いやBFSでできる → いやマンハッタン距離を求めるだけだ, という感じになり, それっぽいコードにしてコードを出したら通りました. 後から考えると, ある点の高さの範囲が存在しない以外は, 2点間で高さが2以上となる点が存在することは簡単に証明できるんですね〜. 

この問題結構典型だったらしいですね. 問題演習の量を増やしたいと思います. 

 

B問題を解ききって順位表を見たら, 40位ほどでそこそこいい位置にいました. 時間も残り4時間弱あったので, あと一問解こう!できたら二問解こうと意気込んでいました. 

 

僕らがB問題を解いている間にspiderさんにH問題を見てもらいました(Standingを見ていたら圧倒的にHを通している人が多かった). 

説明を聞いた感じ構文解析みたいな問題でした. 3つのルールがあって, ある文字列が渡されそのルールを満たすものが何個存在するか的な問題だった気がします. 小括弧そのものがルールを満たし, 小括弧が隣り合うこともルールを満たし, 小括弧を小括弧が挟むものもルールを満たすという感じでした. 

これだけだと問題は簡単なのですが, 「-」という文字が来たときは, 今まであった文字列から括弧を消す必要があります. その状態で, ルールを満たす文字列を求めなければなりません. そこで僕らは括弧の状態をスタックに保存し, 「-」が来たときは, スタックの一番上を取り出し, 取り出したものを用いて, 前の状態に復元するという実装にしました. 

それっぽいコードができたのですが, 必要な機能をひたすら継ぎ足すということをやってしまいました. あまりコードを理解せずに口を挟んでしまったような気がします(良くない). 

スタックへの保存と復元ではなく, そもそもの構文解析がうまく行ってないことに気づきバグを取りながら, そしてスタックの実装も修正しつつ, サンプルケースが全て通ることを確認し, 提出しましたが, Wrong Anserを吐いてしまいました. コーナーケースがわからなかったため, 適当に自分たちでテストケースを作りましたが, 全てうまく通るのでおかしいなと思いながら悩みました.

int型じゃ大きさ的に足りないことに気づき, long long型にして提出しましたが通らず, 結局Wrong Answerのままコンテストが終了してしまいました. 

あっという間に5時間が経ってしまいました. 

 

そしてコンテストが終了して, コンテストの問題解説や表彰がなされました. 問題解説の時間は, 疲れて寝てしまいました(A,B,H以外の解説を聞いてもわからなかった).

コンテストのランキング発表もありました. コンテスト終了30分前からランキングが凍結されて見れなくなってたらしいですね(運営がそういう話をしていたらしいのですが話を聞いていなかったため, ランキング発表がされて皆が盛り上がっていることからやっと意味がわかった).

UKUNICHIAすごいなあ..., 海外勢エグいなあ, 将来こういう人たちと戦えるぐらいになりたいなぁ, とか思っては, しみじみとなっていました.

 

表彰が終わり, 懇談会が始まりました. 皆で写真撮影をした後, 企業賞を受賞するチームが発表され, 表彰されていました. このとき, まだ企業のブースには誰も人がいなかったので, さり気なくRoy_Rと共に色んなブースを回って, もらえる景品をもらえるだけもらっていました. 

 

企業賞の表彰が終わり, 皆で乾杯をしてパーティーが始まりました. 食事が豪華だったため, 食べれるだけ食べました. JAGで会った人たちと話しました. てぃーいけさんとも話し, 競技プログラミング辛いねw的な話をしました. 辛くもなりながら, M1まで毎年ICPC参加しきった彼は, どこか優しやと強さに満ちていました. 

 

楽しい時間というものはあっという間に過ぎるもので, 宴も終わりに近づき, 物寂しさを感じてしまいました. 夏休みが最後に近づくにつれ, 感じる儚さといった心情です. 

レートが上がらずに悩み, ICPCを迎えたくないなとあんなに思ってたはずなのに, いざ終わってしまうと, 自分が予想以上に楽しんでいたらしくて不思議な気持ちです. 

 

チームメイトと別れを告げ, アルバイトに来ていた大学の友人と, 一緒にラーメンを食べに行きました. ICPCが終わって欲しくないという思いからか, 横浜の町並みをなんとなくブラブラしました...

 

帰宅した途端, 疲れからか何もしたくなくなり, 布団に潜り込んでそのまま寝てしまいました.

 

夢うつつな状態のまま深い眠りにつきました...

 

三日目

企業見学に行ってきました!!

僕はグループCだったので, NECしながわ水族館Huaweiという順番で回りました. (もちろんしながわ水族館も企業見学の一環ですよ???)

 

他のチームメイトが実験や中間試験などの理由で来れなかったため, 一人で企業見学に参加しました. 心細かったですが, グループCにてぃーいけさんやabc050さんなどの知っている方々がいて安心しました. 

最初にNECに見学に行きました. NECに向かう途中, 前日の疲れがまだ残っていて, そんな中満員電車に揺られました. 毎朝電車に揺られながら出勤するの嫌だなー, 社会人になるの嫌だなーと企業見学前から思ってしまいました...

 

いざNECに行ってみると, NEC本社の大きさにびっくりしました. NECビルの27階(だったかな?)から見る三田の町並みは圧巻でした. 東京タワーのオーラが消えたと思うほど, 東京タワーが大したことなく見えました.

社員の話を聞いてみると, 会社が大きいだけあって色んな分野の部署があり, 行きたい部署に移って, 様々な挑戦をできるということに魅力を感じました. しかし, まだB2ということもあり就活するという実感があまり湧きませんでした. (今年の夏のインターンで, 朝起きて出勤することが辛すぎて, 院進を決意してしまったため, まだ就活を考えることができません) 

NECの最上階で食事を取ったのですが, ものすごく豪勢な食事が出て勝利?を実感しました. 魚介に, お寿司に, ローストビーフに!という感じでした(あれ?お寿司は魚介に含まれる?). 一人暮らしということもあり, 栄養をいっぱい取っとこうと思い, ありがたく頂きました. 

 

次にしながわ水族館に行きました. 

今年はPreferred Network社の企業見学がなくなって, 急遽しながわ水族館見学ということになったそうです. ICPC事務局側も大変だったと思います...

 

まあそうはいいつつ, 実はしながわ水族館ものすごく楽しみだったのです!

 久しぶりに水族館に行ったこともあり, 童心を思い出しではしゃいでしまいました. いるかショーではいるかの大きさに圧倒され, 海に一緒にいたら恐らく勝てないなあと思いました.

 

abc050さんと水族館を散策していたら, 他の人達と離れてしまい, 迷子?になりました. 水族館の中でICPC関係の人達と誰とも会わないことをおかしいなと思って, 電車に乗って品川のHuawei東京研究室に向かいました. 現地に着いてみたら皆がいて, 余裕を持って到着していてさすがだなと思いました(僕らは集合時間ギリギリに着きました). 

 

Huawei東京研究室では, 人形をカメラでぐるーと撮ると, 人形がAR化して動くといったサービスの説明や, Huaweiが通信だけでなくハード(スマホ, AR, VR, イヤフォン, など)の設計・製造も行っていることなどを聞いた気がします. 院卒の初任給が高いこと, 英語や中国語が必要な環境, 通信,ハード,ソフトなど広い分野をカバーしていること, サービス展開までの圧倒的スピード感などが魅力的に映りました. 

 

まあこんな感じで企業見学が終わりました. 五限の授業をサボって企業見学に行ってしまった罪悪感からか, 五限チャレンジをしようと思って電車に乗ろうとしたのですが, 無事電車に乗り遅れて授業に出席できませんでした. 

 

感想とこれからについて

予選に通るかわからないという状態で, なんとかここまで来れてよかったですね(あれ?これRoy_Rの感想と同じ気がする?). 

チームメイトがいなかったらここまで頑張ることができなかったので, 感謝の気持ちでいっぱいです.

できれば競技プログラミングはやめることなくゆるふわでもいいから続けていきたいですね. 

12月にマニラ大会にも行く予定なのでなんとか頑張りたいと思います. 

 

一緒に関わってくださった方々, 応援してくれた方々には感謝の気持ちでいっぱいです!本当にありがとうございました!

ICPCアジア横浜大会直前の弱音

こんばんは, yapattaです.

ついにICPCアジア横浜大会開催まであと1日になりましたね.

ここ数ヶ月競技プログラミングをやってて非常に辛かったので, 弱音をつらつらと書き付けていこうと思います. 

 

ただの自己満足だと思って, ブラウザバックしようとしたそこのあなた!

弱音は吐けるうちに吐いとかないと大変なことになるんですよ!

 

あらすじ

因みにICPCとは, International Collegiate Programming Contest(国際大学対抗プログラミングコンテスト)の略で, 大学内で3人1チームを作って与えられた競技プログラミングの問題を速くかつ多く解こうぜ!的な大会ですね. 国内予選, アジア地区予選, World Finalというのがあって, 勝ち上がるとどんどん強い相手と戦えるみたいな大会ですね.

 

7月のICPC国内予選を通過して, アジア横浜大会に参加できる資格を得ました. 大学1年の国内予選で負けたことの悔しさ, アジア横浜大会に出場した先輩が格好よかった(何かに熱中している姿が格好よく見えた), アジア大会出場という響きが格好よかった, ということもあり, 競技プログラミングを本腰入れて頑張ろうと思いました. そして, 大学2年の今年は国内予選を突破するために一心不乱に努力しました. 国内予選の過去問をひたすら解いたし, 自分たちの今の実力で突破できるためにやることは何でも頑張りました. その努力実って, アジア大会に国内予選最下位で参加できることが決まりました.(やった!) 

国内予選が終了し, 順位表見て, 国内予選通過がわかったときの喜びは計り知れなかったです. 大学入学してから一番喜んだかも

 

まあこんな感じでアジア横浜大会参加の権利を手に入れて, とんでもないぐらいはしゃいだ僕だったのですが, 逆にこのことが僕を苦しませるとは当の本人の僕ですら思いもしなかったのでした... 

 

ということで, 本題の弱音を吐いていきたいと思います!!

 

弱音その1

練習してもレートが上がらない!

レートが上がらないなら, もっと努力しろよ!っていう人もいるとおもうのですが, 努力しても成果が報われないのは思った以上にきついんです... 

蟻本の問題を毎日一問ずつ解いてわからないアルゴリズムを減らしたりとか典型問題に強くなったりとかしたのですが, 実際コンテストに出てみるとあと5分あれば解けたのに... みたいなことを繰り返してしまい, なんで解けなかったのだろうと自分を責めてしまう日もありました. 本当に空虚な気持ちになります. 本来楽しくてやってるはずの競技プログラミングなのに, 苛ついてヤケ酒をしてしまったこともあります. (余計空虚になります)

 

努力の仕方を変えるしかないと思って, 「天才!成功する人々の法則」などといった本に走ることもありました. 一流になるには1万時間以上かけたほうがいいとか書いてありましたが, 今から1万時間とか無理だろ!とか思ってました.  (たぶん本を読まずに精進した方がいい)

今思うとこいつ何やってるんだ..., と思います.

たぶんもっと身近な例とかを見て頑張ったほうが良かったのかもしれませんねー

 

 

弱音その2

自分のレートは上がらないのに, チームメイトは着実に実力をつけている or 自分より遅く始めた人がどんどん先に行ってしまう. 

こればっかりは, 他人のことなのでしょうがないと思うのですが(たぶん自分より頑張っているんだよな), 相当悔しがっている自分がいました. 練習のモチベーションも下がりましたし, それでも練習しないと勝てないので重い腰を上げながら, なんとか楽しもうと思って練習しました. 

 

追い越さないといけない!と思って, 気を張ってコンテストに参加するのですが, こんな気分だとコンテストを楽しめることもできず, 変なバグをコードに埋め込んでしまったり, 解法が思いつかなかったりと, どんどん悪いスパイラルに陥ってしまいました. 

 

さらに, 秋学期はICPCアジアに専念したいと思い, バイトの誘いとかも全部断っていたものですから, レートが上がらない, 他人にどんどん差をつけられるということは, 自分にとってかなりプレッシャーになっていました. 何のために, 競技プログラミングに専念しているのかわからないという日が続きました. 頑張っているはずなのに, 成果が出せていない, 進捗を埋めていないと思い, 自暴自棄になってしまう日もありました. 

 

 

弱音を吐いてみて

上の弱音を見てみるとどんどん悪いスパイラルに陥っていることがわかりますね. 全く競技プログラミングを楽しめてないですね. 相当良くない状態になってたということがわかります. しかし, こうやって他人に向けて弱音を吐くいてみると, 結構自分の中でまとまって, 再び頑張ろうと思えますね. 

ということで, 今週末のICPCアジア地区予選頑張っていこうと思います!

 

大会終わったらご飯誘ってくれると嬉しいです!

元気がもらえる気がします!

 

AtCoder AGC014 B - Unplanned Queries

久しぶりです。

yapattaですー。

競技プログラミングの問題でも一つ。

結構面白かったし自分の理解のために説明でもしてみようかと。

 

問題概要

構造がわからないN頂点を持つ木が用意されている。M個のクエリが実行される。

ここで言うクエリとは(a,b)という形で与えられ、クエリを実行すると頂点aとbを結ぶときに通るパスに書かれた数を+1する。初期状態ですべての辺には0が書かれている。

クエリをすべて実行した後に、すべての辺に書かれた数が2の倍数になるような木の構造が存在するなら"YES"、それ以外は"NO"を出力せよ!という問題。

 

考えたこと

すべての頂点において、クエリ(a,b)として現れる回数が、偶数個になるとき"YES"となり、一つでも奇数個になるとき"NO"となる。

 

理由

まず、ここでaとbのLCAをtと、今回の木の根をrと置く。

(a,b)というクエリを、(a,b)を(a,t), (b,t)と置き変えられる。

(LCAとは、根付き木のある二頂点a,bの共通祖先で最も根から離れている頂点)

 

aとt間の辺には+1, bとt間の辺には+1とする。

これはaとr間、bとr間に+1をすることと同じである。

なぜなら、aとr間、bとr間に+1をすると、tとr間が+2されてしまうが、それぞれの辺に書かれた辺の数が2の倍数になるかさえわかればいいので、+2と+0は同じに見なされるからだ。

 

次に、親から一番離れている点でかつクエリ(a,b)として現れる回数が奇数個の点に着目する。

このような点を一つでも含む場合、"NO"になる。

このような点をk、kの親をk'と置く。

このようなkが存在する場合、すべての辺に書かれた数が2の倍数になるような木の構造が存在しない。なぜなら、kとk'を結ぶ辺に書かれた数が奇数になるからだ。 また、他のクエリにおける、kとkの親を結ぶ辺に対する加算ではすべて+2される。つまり、(k,k')以外のクエリですべて+2されるから、(k,k')以外による影響を考える必要がない。

  上記のような考察が僕の頭では精一杯でした。

ということで、ソースコード

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

int main(){
    int n,m;
    cin >> n >> m;
    vector<int> edge_num(n,0);
    for(int i=0;i<m;i++) {
        int a,b;
        cin >> a >> b;
        a--,b--;
        edge_num[a]++;
        edge_num[b]++;
    }
    for(int i=0;i<n;i++) {
        if(edge_num[i]%2 == 1) {
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;
    return 0;
}
 

 

ICPC2019国内予選参加記

こんにちは、yapattaです。

先日、ICPC2019(競技プログラミングのチーム戦の大会)国内予選に参加してきた。

チーム名choKOdai、ABCの3完、最終順位85位でした。学内3/20位でホスト校枠で、アジア大会に参加できそう。いやあ、本当に良かった...

僅差で同大学のチームに勝てたので、本当に良かった...

f:id:ziroppe:20190713114829j:plain

ICPC2019国内予選の順位表

 

今回の記事では、本番にどうやったかと、本番までの練習で何をやったか書いてきたい。

 

1) 本番について

なんかICPCのルールが改訂されて、チームごとにキーボードが1台しか使えなくなった。多数決でJISキーボードを使いコーディングするわけである。しかし、僕は普段USしか使わないため、JISを使うとコーディングが遅くなる。よって、今回はほぼコーディングをしていない。

 

まず、蜘蛛さんに印刷してもらっているうちに、残り僕ら2人がA,B問題を見ていた。A問題はただ生徒ごとに個々の点数を合計してソートして 最大値を求めるだけだ。速攻で書いて、次にBを見る。Bはマンハッタン距離だとRoyくんがすぐにわかったため、keyをある文字、valueを文字のx,y座標を記録したpairを持つmapを作り、距離を求めるという実装を書いてもらい終了。A、Bをとき終わった時点で、20分経っていなくて安心した。

C問題を蜘蛛さんとRoyくんに考えてもらって、僕はD~Fあたりの調査をすることに。D問題の内容を伝えるときに誤読してしまい、誤読したコードをRoyくんに書かせてしまった。これは本当に反省。こんなことしている間に、蜘蛛さんがCのコードを書ききった。しかし、テストケースが上手く動かない。なんとか例外処理を修正してCを通した。とりあえず2時間以内に3完したので精神的に安心。E問題はやるだけっぽそうだけど、通している人がDの方が多い印象があり、結局Dを考えていた。D問題はAtCoderの花壇の問題に帰着できるきがするという話をチームメイトとしていたが、mを超える場合に関してなど、具体的な実装が思いつかず時間も残り30分のためEを見ることに。そして、僕がEをとりあえず書いている間にコンテスト終了。(もちろん書ききれなかった)

 

2) 練習について

本番2週間前から、週末集まって3時間計って模擬国内を解いていた。(JAG2019とJAG2018)

平日の授業後や空きコマに週2日ぐらい1時間以内でABCセット(300点以下の問題)を三問速解きする練習をRoyくんとやっていた。今回のAB問題については速解きの練習が本番に生きた気がする。

あと週一回のサークルで時間内に解けなかったとしても、なるべくすべての問題をAcceptするよう努めていた。(400点問題は解くのに時間がかかっても、非常に勉強になった)

あとは、個人でAOJ ICPCを埋めるとか、AtCoderに参加するとかしていた。

個人的に、脳筋ゴリゴリの実装問題を練習していた。

ちなみに、ICPC前のAtCoderで2連続レートが落ちていたけど気にしないようにしていた...

 

今回のコンテストでは仲間に頼った部分が多かったので、アジア大会では、是非仲間を引っ張れるように頑張りたいな。多分最下位通過でもあるので、夏休み使って是非精進したいな。