ICPC2020 Asia Yokohama Regional 参加記
だ~っと書いた日記です。
一日目
例年と違って今年はオンライン開催。初競プロオンサイトのチャンスだったので、やっぱりちょっと残念。
一日目は午後からだったけど、二日目は朝9時からコンテストが開始なので一日目も早起きした。ちょうど寝る前にAHC001のシステスが走っていたので、それが気になって早く起きられたな。
13時半までに受付(学生証をカメラでチェック、これのためにwebカメラ買った)を済ませる必要があって、ちょうど13時にzoomに入った。めちゃくちゃnoborito290yenが連呼されててすでにちょっとおもろかった。呼ばれたチームから順番に、zoomのブレイクアウトルームってのにチームがどんどん割り振られていく感じだったっぽい。
途中でThe atamaを運営の人が探すときに「あたまさん、あたまさん一人見つかりません」を連呼していておかしかったな。リストもそれに染まっていた。
学生証チェックだけどピントが合わなくてOKがパッともらえなかった。ピント合わせるの水diffくらいある。
開会式が始まった。アイコンがTwitterと同じ人かなり誰かわかりやすいな。リハーサルコンテストは「使い方に慣れてください」をめちゃくちゃ強調されたけど模擬地区やったからだいたい大丈夫だな~みたいな気持ちだった。
あ リハーサルコンテスト後に今入ってるZoomの部屋に戻ってくるのか(メモ) 誰か紛失してそうURL(この少し後のTLで保存してない、みたいなのを誰かツイートしてた気がする)
slackの通知音が無限に聞こえてくる 10秒に一回くらい スッココ ←だんだんこれが面白いと感じてくる、通知音で笑ってしまう罠
ジャッジシステムの説明北、DOMjudgeってやつでした。
二次方程式を解く問題をライブコーディングしてて、0割をケアしてなくてWAだったけど、説明してる人慌ててない。あまりに自然な流れだったので台本だったのか…と把握。そのままclarの説明行った。
これすき clarは英語で送れとのこと
流行語大賞 ぜひAtCoderでも使っていこう(迷惑では?それはそう)
リハーサルコンテスト始まったのでやっていき
TLEとかWAとかわざと出してねって言ってたからa.pyをC++選んで出してみる CEかな?と思ったら
None of the submitted files match any of the allowed extensions for C++ (allowed: cpp, cc, cxx, c++)
ちゃんとこれが出た。ペナにならないっぽい。すげー。
質問の送り方もちゃんとやっておく。
AとBはいいとしてCはよくわからんだったな(実力さん……)、Judging Detailを読んだりしておく。
WA、OLE、CE、NO-OUTPUT、TLE、RE、TOO-LATEなどエラー全部出すをした。CEでペナつかないのはAtCoderと同じだったな。
Contact to Staff以外は英語で質問をしてくれとのこと(メモ)
居残りのチームあってびっくりした。しかもそのチームNから始まるから自分が呼ばれたのかと思った。これ結局なにで呼ばれたかどこでも知ることができなくて今も気になってる。
今日は早く寝るぞい!(寝た)
二日目
7時起き!
リストを見てると人々が続々と起きている。
8時半にはZoomなので着替えてこなきゃ……一限より早いやん。
少々の注意事項があって、コンテストが始まる。
もうここからかなりうろ覚えだけど、まあとにかくコンテストをやった。うちは緑水青のチームだった。AもBも分けてやるより全員で考察を進めていくみたいな形でやった。並列コーディングの恩恵はそんなになかったけれど、結果的にそれでAB通した時点の順位が最終よりはよかった気がする。うろ覚えだけど。
まあさらにBも全員で進めるというよりは、僕だけこれチームメンバーが通しそうだなと思ったあたりでJの読解に移ったりしていた。最終的にはABJの3完でコンテスト終了。JをACした後にGを読んでいたけれどわからなかったな。最近アルゴをやってなかったのもあって、テストケース作ったり読解やデバックばかりして実装はすべてチームメンバーに任せた。チームメンバーありがとう……。
順位表凍結(60分前になると各チームの提出がACかWAなのかわからなくなるシステム)の後の結果を貼りますと38/40位でした。難しい問題ばかりだったけれど、同時に強いチームばかりだったなあと改めて実感させられた。
順位表のリンク↓
そっからはずっとGather Townにいた(ICPC運営からここで懇親、交流してね!と言われていた場所、なんかブラウザ上でマップがあって近くにいる人と通話できるサービス)。とは言っても「チーム名+本名」表記なので、知らない人にはめちゃくちゃ話しかけにくかった……。プロフィールにTwitter ID書いたり、suffixにハンドルネーム書いたりしてアピールしておきました(でも最終的に話したいと思っていた人に話しかけられないこともあったな~~~)。
Gather Town開始直後に店長さんがTwitterで募集をかけていたので凸る。
そっからはりゅうせいさんが集まったり山梨大のちるけーきさん(この人僕や店長さんら6人くらいがいるところに凸ってきたのすごかった、最初流れているYoutube Live側の音声だと思ってしまい申し訳ない)が来たりで結果発表などを聞きながら人々と喋っていた。ICPCから配られたポテチやチョコレートもお腹に入れていた(ICPCのポテチ美味しかった)。Yes/Noマン(筑波大の先生なのかな?)のおかげでYes/Noが面白いのを実感したり、上位6チームのつよつよのコメントを聞いて、かっけ~と思うなどした。__KING_____マジですごかったなあ。
せっかくなので企業ブースに行ったり(Googleの方と喋ったりした)、問題Bのブースに行ったらJAGの方が来たり(りあんさんやamylaseさんと喋れた!こちらとしては一方的に知っていたので喋れてすごい!!!!みたいな気持ちになった)で楽しかった。あとうちのチームのmiiifaが前に競プロerスノボ?に行った関係でととりさんやolpheさんと喋っていたので混ぜってもらった。農工大競プロerに対して勝手なファン意識見たいなものがあったので喋れてかなり嬉しいみたいな気持ちがあった。
Gather Townの終盤はharaharaのうちのお二人やLorentさん、あとtsutajの方と喋っていてとても楽しかった。喋っているうちにGather Townを占める時間になっていたので名残惜しいけど解散をした。Lorentさん、マジで良い人だったな~~~~~~~。
まあアジア大会だったのでそれについてもうちょっと振り返っておくと、少し前に卒論が重なった時期だったのもあって(?)、競プロとは少し離れた時期にICPCアジア大会を迎えることとなった。もちろん元々の実力が離れていたのもあるが、それもあって上位はなんて遠い存在なんだ……。と改めて実感しました。強い人はAOJ-ICPCの550以下を埋めているし、直前になんどもバチャをしている。すごいなあ、遠いなあと改めて感じました。
国内予選通過もギリギリのラインだったので、そこから予想できた結果ではありましたがなんだか無力感みたいなのがあります。でもすごい強い人たちがいる大会に参加できたり、その後の懇親会も楽しめたのでとてもよかったです。最初に言ったようにオンラインでの開催だったので、オフラインとは違ったものになりましたが、その中でもとても楽しい経験ができた大会だったと思います。運営の方ありがとうございました!!!!
次の(自分のラストの)ICPC国内予選も突破してアジア地区行けたりしたらいいな。そんなことを考えています。参加した方はお疲れさまでした、応援してくれていた方はありがとうございました!
AHC001 参加記
AtCoder Heuristic Contest 001に参加した!技育祭でchokudaiさんが「ヒューリスティックスコンは自分の書いたプログラムを育てるのが楽しい」のようなことを言っていたけれど、かなり実感した。
一週間のうち、最初の3日と最終日にがっつり取り組んだ。ICPC模擬地区があったり、技育祭が三日間あったりで取り組んでない時間のが長かった。
システス前46,877,146,209点で431位。
やったこと
Introduction to Heuristics Contestの解説がRustだったので、Rustで自分も取り組んだ。vis.rsからscoreやintersectをそのまま持ってこれたりして楽だった。
一日目
- 1*1の正方形を作る 823090点
- 外周までの距離で各長方形をソートしてから、各長方形を他の長方形と交差しないように拡大 453億点
二日目
- 局所探索法を書く 目標面積より小さい長方形(公式ビジュアライザにおいてより青いものから)を拡大する 交差したらほかの長方形を縮小 456億点
三日目
- 焼きなまし法を書く 456億点
- 適当に長方形を選んで縮小する近傍を増やす
最終日
- 縮小する近傍を減らす
- バグがあったので直す 468億点
自分の提出↓
https://atcoder.jp/contests/ahc001/submissions?f.User=ntk_ta01atcoder.jp
あとは、グラフを書いたり
(焼きなまし法実装直後は解が全然動いてなくて困惑した)
(終盤はちゃんと動くようにグラフを見ながら温度いじってた)
GitHub(private)にコードとメモ上げたりしてた。最終日に改めて取り組むときに何やってたっけ?を思い出せてよかった。けれどやっぱりまだ使い方がちゃんとわかってない。
コンテスト終了直後、TLに大量に知見が流れていたのでまとめていきたい↓。
自分用人々の知見まとめ
hakomoさん
#AHC001 https://t.co/LpG29J0EgM
— hakomo (@hakomof) 2021年3月14日
多スタートと山登り。なんか近傍で賢いことしてそう。
TERRYさん
※後日参加記を書くとのこと
AHC本当にお疲れ様でした。49,577,244,111点で暫定14位。
— TERRY (@terry_u16) 2021年3月14日
(1)ランダムな長方形を拡大・縮小・平行移動させる焼きなまし
(2)2つの隣り合う長方形をランダムに選んで破壊し、境界を嘘黄金分割探索で探しながら最大長方形問題を解く焼きなまし
を用意して、(1)→(2)→(1)の順で流しました。 #AHC001 pic.twitter.com/GIQsNxmiuR
長方形を破壊するみたいな発想出なかったな。最大長方形問題ってなに…?ビジュアライザが動くと楽しい(それぞれ途中結果を出力してパラパラ漫画的に作ってるらしい)。
TERRYさんによる初心者向け解説
めちゃくちゃ丁寧で参考になる。Tipsまで全部読むべき。さらに参加記も書くそうで…すごいな…。
takumiさん
※後日参加記を書くとのこと
#AHC001 暫定25位(49.524G)
— takumi152 (@takumi152) 2021年3月14日
やったこと(簡略版)
長方形の上下左右端のいずれか1方向(もしくは2方向)の位置の変化を近傍とした焼きなまし。初期状態は全ての長方形の大きさを10000x10000としたもの。評価関数は面積によるスコア-重なってる部分の面積によるペナルティ(時間経過で増加)とした。
ペナルティをつける、みたいなのやったことない(自分は重なりを許さないような実装をしました)。
じろうさん
僕の解法では
— じろう (@Jiro_tech15) 2021年3月14日
「4方向に引力を発生させる」
「面積の最大値を時間経過につれて50%->100%」
が特に重要でした#AHC001
自分も平行移動みたいなことをしたかったのだけれど、実装できなかった。引力?を発生させるみたいなのすごい。
さはらさん
Dynamic AABB Tree を作って多点開始焼きなまし
— さはら (@shr_pc) 2021年3月14日
近傍は
・膨らませる
・ランダム変動
・接触している箱のペアを「転置」する
で、重なった場合は1段階だけ押し出しを試みる
焼きなまし過程を観察したかったのでコードに埋め込めるタイプのビジュアライザを作りました(svgで描画→html出力) #AHC001 pic.twitter.com/FoT4et83cU
知らないTree出てきた。自分は膨らませる近傍しか最終的に実装できなかったけれど、人々はいろいろな近傍を作っていてすごい。あと今回みたいな局所解にハマりやすい感じ(これ問題の性質ではなく自分の実力のせいだったりしますか?)だと多点スタートがやっぱり強そう。
ymatsux ACさん
#AHC001 496.6億解法
— ymatsux AC (@ymatsux_ac) 2021年3月14日
焼きなまししました。
遷移(1):
・目標値より大幅に小さい広告をランダムに一つ選んで、それをランダムな方向に拡大する。拡大量は [1, 10000] の範囲から指数分布でサンプルする。拡大するとき他の広告の中心に衝突したら、拡大方向と垂直な方向に縮小し衝突を回避(続)
考えてることとしてはこういうことがやりたかった。空白地帯を使ったり、ランダムな変形をいれるなどができなかったな。
可視化大事だな~~と感じたあたりまとめ
#AHC001 お疲れ様でした.
— si💊 (@iiljj) 2021年3月14日
暫定スコア 486.9 億点,148位でした.
焼き鈍しです.ときどき形を矯正したり破壊したりして,いいスコアになる state を探しました.
typescript でビジュアライザを作って,スコアが悪い問題を観察しながら進めていました.せっかくなので動画を貼ってみます. pic.twitter.com/BxxjMkuJb6
焼きなましは途中状態を眺めるの必須なのでこういうのを作っていた #AHC001 pic.twitter.com/673ZMxYkio
— tomerun (@tomerun) 2021年3月14日
そういえばとりあえず可視化は改善点を見つけるのに便利なので、実行しているリアルタイムにブラウザに通信してソルバにヒント与える仕組みを作っていました。(SocketIOありがとう...コード: https://t.co/97AWfaQNvo) #AHC001 pic.twitter.com/nDS0GHc3bi
— きゅうり (@kyuridenamida) 2021年3月14日
次回はこういうの作りたいな。
iwashiさん
序盤の順位表から考えたことやスコアの伸びた/伸びなかった方法など、かなり細かく一週間何をしていたか書かれていてめちゃくちゃ参考になる。
optさん
#AHC001 お疲れ様でした〜
— opt (@opt_cp) 2021年3月14日
制約付き非凸 (連続) 最適化ソルバを雑に書いて、その出力解を雑に丸めて整数解を得ました。49.1 G点でした。
optさんだけ違う問題を解いているかのよう……。
ウォンバットさん
#AHC001 よく考えると、広告が大きすぎる分には後で削ればいい (連続とみなせることが効いている) ので関係ないことに気づきます。そこで領域全部を広告で埋めるという制約を課しました。すなわち、画像のような途中状態を取りうるということです。 pic.twitter.com/v5Vieu9PU5
— ウォンバット (@packer_jp) 2021年3月14日
こういう方針もあるんだ、という気持ちに。
binさん
49.42Gでした。
— bin💊 (@5bin101) 2021年3月14日
焼きなましで、初期解は823090になるやつ。
遷移は2つあって、
①どこかの辺の長さを1変える
②ある広告を選んで、それとそれに接している広告を初期解に戻して①の山登り#AHC001
縮小や破壊、実装できずにちゃんとわかってなかったのでこういうことなのかやってみよう~~~と思った。
人々の知見が多すぎてまとめきれてない。Twitterの#AHC001 タグももうちょっと漁りたい。
次のAHC002も楽しむぞ~~~
AmongUsの戦績っぽい値を返すDiscordBot書いた
まとめ
こういうやつ.
モチベ
最近は知り合いとAmong Usをやることが多い.
ふとゲーム内の統計を見たときに「これ勝率とか見れたらいいのにな~」と思って,簡単な計算をするBotを作った.
画像から文字を読み取るのをBotがやってくれるといいな~ってのが一番のモチベだった.
やったこと(画像から文字認識)
tesseractという文字を認識してくれるエンジンがあるみたいでこれをインストールしてきて,pyocrから利用した.
ここがモチベだったのだが,スクショの画像そのままだと文字を読み取る精度が低かった.
この画像に対して,
こう.
う~~~ん.微妙.Bot作るのやめるか?困った.
困ったのでtesseractのドキュメントのサンプル画像を見に行くと白背景かつ黒字のものが多く,似たような雰囲気にしたら精度が高くなると推測した. 実際,画像をグレースケール変換してからネガポジ反転させたら精度が高くなった.
いいじゃん!
やったこと(herokuでデプロイ)
あとはDiscord.pyのAPIリファレンスとにらめっこしながらコマンドを実装して,手元では動くようになった.常時動かしたいな~と思ったので,ググったらherokuに置くのがよさげと判明.使ったこともなかったのでアカウント作成してBotを稼働させる!
しかしすぐに動くことはなく,苦戦した. tesseractをherokuのほうに入れて,settingsのbuildpackからaptを使えるようにしたのまではよかった.けれどどうにもtesseractが上手く動いてなかった.
いろいろ探していたら似たようなことで困っている人がいた.
回答にあったようにstack:set heroku-18
をしてみると…動いた!最高!
TESSDATA_PREFIXを環境変数として設定して完璧!完成!
こういう非競技プロの経験をもっと増やしていきたいぜ…….あとBotの機能ももう少し増やしたり,画像は背景が写らないようにした方がきちんと読み取れるのでそこをなんとかしたりしたい.
参考にした記事
Pythonで実用Discord Bot(discordpy解説) - Qiita
ABC123 D - Cake 123
WriterがE869120さんとsquare1001さんの双子なので別解がたくさん紹介されている.公式解法3に近いが,途中でheapqに追加していくというよりは,次の候補を先に全部追加して解いた.
解法
制約からAとBの和は全列挙できるので,まずそれを行う.AとBの和の配列ABを降順ソートし,ABの先頭の要素とCの要素それぞれとの和を優先度付きキューに入れる.このとき,和とABのindexをペアにしてから入れる.
それからK回優先度付きキューから値を取り出す.i回目の操作では,i番目に大きいAとBとCの和が取り出せる.
ABのindexをインクリメントしてから,そのABとそのとき取り出しているCと和を取り,再び優先度付きキューに戻すことを繰り返す.
pythonのheapqを扱うときは,3要素以上のタプルをheapqに入れると計算時間が長くなることが多い.公式解法3よりもこちらの解法のがよさそうな気がする.またpythonのheapqは最小ヒープなので,マイナスをつけて最大要素を取り出せるようにする.
コード
def main():
X, Y, Z, K = (int(i) for i in input().split())
A = [int(i) for i in input().split()]
B = [int(i) for i in input().split()]
C = [int(i) for i in input().split()]
AB = []
for a in A:
for b in B:
AB.append(a + b)
AB.sort(reverse=True)
from heapq import heappush, heappop
ABC = []
for c in C:
heappush(ABC, (-(AB[0] + c), 0)) # 和, ABのindex
ans = []
while len(ans) < K:
(s, idx) = heappop(ABC)
s = -s
ans.append(s)
s -= AB[idx]
idx += 1
if idx < X*Y:
s += AB[idx]
heappush(ABC, (-s, idx))
ans.sort(reverse=True)
print(*ans, sep="\n")
if __name__ == '__main__':
main()
これだけたくさん別解があると強い人はどう早く解くのか気になる.50分くらいかかったので,水diffを解くスピードをもっと上げたい.強い人の提出見に行く.
見に行った.ねてるくんさんの提出が参考になって,2回に分けて全列挙するみたいな感じだった.シンプル.
ABC170 E - Smart Infants
コンテスト後,公式解説に「multisetなどを用いることで高速に処理することができます」ってあったからPythonじゃ解けないのか??と放置していた問題.2時間くらいかかっちゃったけど,なんとかC++で解けた.
解法
シミュレーションをする.
各幼稚園ごとの幼児のレートのmultisetと,幼児をキーとし,その幼児のレートと幼稚園のpairを要素としたmapと,また各幼稚園の一番レートの高い幼児を最強園児と呼ぶが,最強園児のレートのmultiset を用意する(最後だけ説明の都合上,名前をつけた).
各クエリにおいて,幼児のレートを,転園前の幼稚園を,転園後の幼稚園をとする.やることは以下の通り.
- 転園前の幼稚園の最強園児のレートをから削除する
- 転園処理の消去部分を行う
もし転園前の幼稚園にまだ幼児がいれば,転園前の幼稚園の最強園児のレートをに挿入する
もし転園後の幼稚園に幼児がいれば,転園後の幼稚園の最強園児のレートをから削除する
- 転園処理の挿入部分の処理を行う
- 転園後の幼稚園の最強園児のレートをに挿入する
実装の注意は,multisetから要素を消すときは,単純にeraseをするとすべて消えてしまうこと.
multiset<int> top; top.insert(10); top.insert(10); top.erase(10); // 10が二つとも消える
一つだけ消したいときは,
multiset<int> top; top.insert(10); top.insert(10); auto it = top.find(10); if (it != top.end()) { top.erase(it); // 10が一つだけ消える }
とするといいらしい(下のACコードでは面倒なのでif文のところを書いていない).
あと初めてのmultisetだったので知らなかったが,
*top.begin(); // 最小値 *top.rbegin(); // 最大値
らしい.
- 追加サンプル1
3 3 20 30 10 30 10 30 2 500 1 500 1 30
- 追加サンプル2
3 3 10 3 10 4 10 5 1 4 3 4 2 3
出力は全部10になる.
コード
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
using namespace std;
using ll = long long;
template <class T> using V = vector<T>;
template <class T> using VV = V<V<T>>;
constexpr int INF = 1e9 + 7;
constexpr int _MAX = 200005;
/* -------------------------------------------------- */
void solve() {
V<multiset<int>> T(_MAX); // 園b : レートa
map<int, pair<int, int>> mp; // 幼児i : レートa, 所属園b
multiset<int> top; // 最強園児のレートの多重集合
int n, q;
cin >> n >> q;
rep(i, n) {
int a, b;
cin >> a >> b;
--b;
T[b].insert(a);
mp[i] = {a, b};
}
rep(i, _MAX) {
if (!T[i].empty()) {
int v = *T[i].rbegin(); // 園iのレートの最大値
top.insert(v);
}
}
int ans = *top.begin(); // 最強園児のレートの最小値
int c, d;
while (q--) {
cin >> c >> d;
--c;
--d;
auto [a, b] = mp[c];
mp[c] = {a, d};
int v = *T[b].rbegin(); // 園bの最強園児のレート
top.erase(top.find(v)); // いったん消す
T[b].erase(T[b].find(a)); // 転園処理(消去)
if (!T[b].empty()) {
v = *T[b].rbegin(); // 園bの最強園児のレート
top.insert(v);
}
if (!T[d].empty()) {
v = *T[d].rbegin(); // 園dの最強園児のレート
top.erase(top.find(v)); // いったん消す
}
T[d].insert(a); // 転園処理(挿入)
v = *T[d].rbegin(); // 園dの最強園児のレート
top.insert(v);
ans = *top.begin();
cout << ans << "\n";
}
}
int main() {
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
// cout << fixed << setprecision(15);
solve();
}
Pythonだとheapqを幼稚園の数くらい生やしてる人とかいたっぽい.
- 今日知ったこどふぉ豆知識コーナー
から
フレンドのコドフォのAC数一覧が見られる!自分は今123AC.え もっと増やしてえ~AC数の近いフレンドに負けません.今AC数が負けているフレンドもできるだけたくさん抜かしたいです.
ABC182 D - Wandering
反省.ABC3完.レート-51.
解法
問題文の,箇条書きの一行で表されるまとまった動作を,ここではステップと呼ぶ.
2回累積和を取った配列から,各ステップの開始時(終了時)の座標がわかる.あとは,各ステップ内で移動できる最大値を計算しておく.これは累積和の累積MAX.(各ステップの開始時の座標 )+(各ステップで移動できる最大値)の最大値が答え.
これを理解するために(発想するために),考えたいことはすべての動作後のロボットの座標は,(各ステップの開始時の座標) + (各動作の移動距離の累積和)で表されるということ.例えば,サンプル2において各ステップの開始時の座標は,である(手元で書くととてもよい).ステップ1において,だけ動かすときは,にロボットがいる.ステップ4において,だけ動かすときは,である.
今知りたいのは,ロボットの座標の最大値なので,(各ステップの開始時の座標) + (各動作の移動距離の累積和の最大値)を各ステップで計算し,そのうちの最大値を求めればよい.
計算量はである.
コード
def main():
from itertools import accumulate
N = int(input())
A = [int(i) for i in input().split()]
S = list(accumulate(A))
T = list(accumulate([0] + S))
M = list(accumulate(S, func=max))
ans = 0
for i in range(N):
ans = max(ans, T[i] + M[i])
print(ans)
if __name__ == '__main__':
main()
ACを取ってからだれさんのツイートについて考えてみると,より問題への見通しがすっきりとした,だれさんありがとうございます…!
Q.25Lの容積をもつからっぽの井戸に水を汲みます。
— だれ (@pro_anyone) 2020年11月8日
1日につき6Lの水を運べますが、夜は2Lぶん蒸発してしまいます。
井戸から水が溢れるのは何日目でしょう?
↑昔の本で見たこの問題が頭をよぎりました https://t.co/yur7dPIzPn
(最小値, 累積和)みたいなのを使う問題.アルメリアさんの記事を読んで解説ACしたけど,まだその感覚が落としこめてない….悔しい.類題
やっぱりABCを5,6完安定してできる実力が欲しい.なんとなく○○をやればいいかな~(今回だったら2回累積和を取ってみた),を実装してサンプルが合わないと思考が止まってしまうことを今からやめる!
手元でサンプルを実験して,ある程度正解である自信が得られてから実装に入りたい.また焦らずに,ていねいに考察ステップを踏むようにしたい.またすぬけさんの書いていた表がわかりやすくて,同じような表を書きたい.知りたい情報について,どう表現できるか丁寧に書くと,どこを高速化できるかわかりやすそう.
今回の内容が,考察に含まれた高難度(と言ってもABC-F)の問題もあるので,やっぱり新規ACを増やしていくことが大事.
そしてやっぱり,AtCoder青になりたいな.精進しよう.
ICPC2020 国内予選 模擬国内 参加記
国内予選終わって一息ついて,シュークリーム食べながらダラダラ書いてます.日記です.
メンバーは oldlickくん(@oldlick_tech)とmiiifa(@miiifa1)で,Flip-Flop Cという名前の水水緑のチームでした.miiifaは研究室の同期でたまにコンテストに参加するぐらいですが,後輩のoldlickくんはコンテストに毎回参加していて僕よりレートが高いです(一回青タッチもしている!).
模擬国内
まず模擬国内っていうのがあるんですよね.これTLのリツイートとかで回ってこなかったら存在が認知できませんでした.でも本番の半分くらいのチームは参加してたかも?(逆に言うと半分だけ?).
模擬国内予選の申込みは本日締切です。本番に近いシステムを利用してコンテストに参加できる貴重な機会ですので、ICPC参加予定のチームは是非参加してみてください。もちろんICPC参加予定の無い方の参加も歓迎です。https://t.co/sD3RJVRlfZ
— ICPC OB/OG の会 (@icpcjag) 2020年10月16日
このときの結果はAB2完でした.
国内予選突破ラインまで10位足りず…(79位 39位と書かれているチームが通過ラインです,間違っていなければふくぶちょーさんのチーム?).
僕がやったこととしては,ABを通して,Dを見に行き,Dが解けないためCを見に行って終了という感じです.初めにoldlickくんがCをずっと考えていたのですが(終わってから気づいたんですが,かなり正解に近い方針だったぽい),ただ彼は実装が上手くいかなかったそうです.miiifaにはDのサンプルを作ってもらったりしていました.おかげで僕のDの解法が嘘だということがわかったりしました.
途中でoldlickくんの話を中途半端に聞いてCとDをバトンタッチしたりしていたのですが,もっとちゃんと考察を聞けばよかった…….二人のできたところやできなかったところを上手く合わせれば行けたかもしれませんでした.チーム戦の難しいところです.Cはテキトーにimos法とダイクストラを書いて,わからねえをして時間切れでした.1
国内予選まであと少し…なんとか3完をする実力はつけて本番に臨みたい,と思っていました.
国内予選までの精進
割と出ると決めるのが遅かったんですよね(模擬国内数日前?).というのもうちの大学の最強ぷちくん(@petite_prog)が,「今年は出ないかな~」という感じだったので参加を見送るつもりでした.ただ,miiifaがそれなら俺が出る!とやる気に満ち溢れていて,そこで誘われたので参加を決めました.
そのためAOJ-ICPCなんて1mmもしていませんでした.画像は確か模擬国内前後のスクショです.
模擬国内でも感じたのですが,全然ICPCに慣れていなくて…やばい!と思ったのでできるだけ精進しました.一応,去年も国内予選は出たのですが….まあまあやったつもりですが,TLの精進erに比べると全然できていないな…という感じがします.pitsuさんとLorentさんの切磋琢磨がまぶしい….国内予選のときです.↓
ひそかにlongrunさんやshop_oneさんをライバルのところに入れて見ていました.longrunさんの精進を追い越す🔥🔥という気持ちでやっていました(これツイートして意識されたら追いつけないな…と思って黙っていました).
あとは同じ大学のチーム集めてバチャを2,3回やりました.AOJのバチャの建て方も覚えました(最初わからなくて,でもどこにも記事がなかった気がする.需要あったら記事にしてもいいなと思っています).
国内予選
当日です.16:30からのコンテストって,なんだかびっくりしませんか?お昼ご飯を14:30くらいに食べたりして,普段のABCと近い感じにリズムを合わせるなどしていました.
リハーサルのURLがほにゃららしていたみたいで,リハーサル開始直後からやろうとした人は困っていたみたいです?
ICPC国内予選のリハーサルを行っていますが、競技システムURLのDNSの設定に誤りがあり、接続しづらい状況となっていました。修正しましたが、反映には最大であと40分ほどかかる見込みです。依然として接続できない方は、40分程度待っていただくか、DNSキャッシュのクリアをお試しください。
— ICPC2020JP (@icpcjapan) 2020年11月6日
ICPC,競プロがさかんでない大学でかつTwitterで情報取得してないと大変だなという感じがします(模擬国内然り,去年は何もわからなかったな~).
開始直前はTLがだいぶ盛り上がっていて,つられてだいぶテンションがあがっていました.
いくぜ!!!!!!!!!!!!!!ICPC、ぞい!
— ntk (@ntk_ta01) 2020年11月6日
しかし,いざ始まってみるとコンテストページが開けない.ICPCodeforcesか?
チームメンバーからも開けないとチャットで連絡をもらったので,通話してどうすればいいか確認.ちゃんと対応の書かれたメールを保存しておいて,よかった….こどふぉがこどふぉったらTwitterで確認しますが,特定のサイト以外のwebアクセスが禁止されているので,審判団の方に電話.しかし,話し中…いや逆に全チームこうなっているのか?とすぐに気づき安心しました.
とりあえずちょっとしたらかけ直そうと思いながらF5連打してると,急に復旧.すぐに切り替えてコンテスト開始.開始直前の高まったテンションがいい感じに落ち着き,かえって集中して問題に取り組み始められました.
A問題をサクッとoldlickくんが通してくれて,僕はB問題を通しました.ちょっとだけもたついたかも.
それから3完する!!というのを意識して,3人でC問題に取り組みました.oldlickくんが書けそうだというので,パーッと書いてもらって,miiifaと僕がデバッグも手伝いつつ,時間がかかりそうな感じでしたがCを走らせました.そして,なんとかテストデータの実行が終わり(今更ですがICPCは普段のAtCoderと違って,手元での実行結果とプログラムを提出します.実質の実行時間制限は3時間),提出したところAC……….模擬国内では2完だったので,嬉しかったです.
そこからDやEを考えるもできずに,終わりました.結果は77位.
oldlickくんのおかげで思ったより高い順位になれたな~と思いました.模擬国内よりチーム数増えてるけど順位は上がったためです.しかも有志による現状のまとめを見るとこれはもしかして国内予選突破…???
急ぎアジア地区出場者をまとめました(暫定、ミスあるかも) pic.twitter.com/2p0zQ8NdTS
— Badlylucky (@small_rakkyoes) 2020年11月6日
ボーダーギリギリなこともあって公式アナウンスが出るまでは安心できませんが,この画像を見たときは喜びのあまり叫んでしまいました.いや,安心したいので一日でも早いアナウンスをお待ちしております…(ICPC運営の方は例年と違う状況やトラブルなどあって大変だったと思いますが,開催ありがとうございました….リプライでもメールでも問い合わせをしたのですが,しっかりと返ってきて助かりました).
(11/16 追記)国内予選突破しました!アジア地区大会では一問でも多く解けるように頑張ります!
ICPC参加した方もお疲れさまでした!