- 56
- 22 574
楽しんで学ぶ
Japan
Приєднався 12 сер 2024
難しくて効率的に学べなくても、楽しんで学ぶチャンネル
学生時代は「美術・体育・音楽」の人間が取り組んでいます。
AtcoderではC++で参加しています。
AtCoder:コンテスト中のルール
info.atcoder.jp/overview/contest/rules
他:x.com/chokudai/status/1799010718555242617
学生時代は「美術・体育・音楽」の人間が取り組んでいます。
AtcoderではC++で参加しています。
AtCoder:コンテスト中のルール
info.atcoder.jp/overview/contest/rules
他:x.com/chokudai/status/1799010718555242617
【AtCoder】ABC391【灰】C++
25回目の参加。122(-1) マイナスです。
問題文の意味が読めませんでした。
\\1完 // C++ ――――――――――――
【AtCoder Beginner Contest 391】
atcoder.jp/contests/abc391
次回:
前回:ua-cam.com/video/HtVZKW0kFtE/v-deo.html
恵方巻は関西で知りました。
競技中ぐだぐだだと、振り返り確認を何度化するのですが
振り返るほどに結構こたえます・・・。
――――――――――――
4:39 A問題 問題
方位の反対を出力する
6:10 vectorで解こうとする
やりたかった解答😓(abc391/submissions/62364099)
8:20 方位を描く【図示】
22:45 8通りで解く( if 文 8 個)
――――――――――――
25:20 B問題 問題【図示】
配列 S の中から配列 T を探す
30:40 入力例1を見る【図示】
条件式が何か分からない
40:25 分からないなりに、自分ならどう考える?【図示】
繰り返し条件に悩む
1:07:35 コードを書く
入力 string
発見したら座標を追加 vector pair
発見回数 vector
1:41:35 現状を整理【図示】
1:50:10 初 tuple で解いてみる
繰り返し条件に悩む(時間終了)
2:05:30 再考【図示】現状の確認
2:31:20 コードを書く
3:08:25 再考【図示】sort をしてみる
3:28:30 ギブアップ(´Д⊂ヽ
――――――――――――
3:29:00 順位表
3:30:00 A問題解説を確認する
3:32:20 【図示】4通り?
3:37:00 B問題解説を確認する
3:38:55 【図示】
4:14:00 条件の読み方(問題文の式)を確認する
――――――――――――
うーーん
おやすみなさいl||li(っω`-。)il||l良い夢を
猫は元気です
アバター:nizima.com/Item/DetailItem/98640
ボイスチェンジャー:www.roland.com/jp/products/vt-4
歌唱曲 ――――――――――――
@otakara_BGM :ua-cam.com/video/U-a4putumCo/v-deo.htmlsi=biCt_mhOgfLbRNnu
BGM ―――――――――――――
なぐもりずの音楽室:
www.youtube.com/@UCj_YkzMARTVs3pNmNoKY2-Q
音楽:zippy
www.youtube.com/@zippysound
Neighbor Eight Sound
neighbor-eight.booth.pm/items/5835167
BGM えんぶらー ――――――――
the path of my life - mini album
bluembler.booth.pm/items/4826502
Ocean in Call - Embler 3rd album
bluembler.booth.pm/items/3375338
Eternity Ravine -revelated- Embler 1st album 完全版
bluembler.booth.pm/items/2907044
Wings for - Embler 4th album (DL版)
bluembler.booth.pm/items/5120988
Embler
bluembler
つきこ
tsubaki_hachi
くーにゃん
maplevanilla30
rune
0x0rune0x0
まめらー
mamera1129
Miu.
Sr_MiuMiu
とーず
tomatoze_
乃葵
noa14236
Slushy
slusluslushy
www.foriio.com/slusluslushy
兎角Arle
arlequin.chimanako.net/
Melefiele
melefiele-official.bitfan.id/
【曲タイトル/エルム凪】 ――――――――
・販売先BOOTHのURL:
【ミニアルバム】心紡ぎ:
erumunagi.booth.pm/items/5063116
Ents'tr vol.1 /ミニアルバム
erumunagi.booth.pm/items/5544381
・エルム凪UA-cam:www.youtube.com/@erumunagi
問題文の意味が読めませんでした。
\\1完 // C++ ――――――――――――
【AtCoder Beginner Contest 391】
atcoder.jp/contests/abc391
次回:
前回:ua-cam.com/video/HtVZKW0kFtE/v-deo.html
恵方巻は関西で知りました。
競技中ぐだぐだだと、振り返り確認を何度化するのですが
振り返るほどに結構こたえます・・・。
――――――――――――
4:39 A問題 問題
方位の反対を出力する
6:10 vectorで解こうとする
やりたかった解答😓(abc391/submissions/62364099)
8:20 方位を描く【図示】
22:45 8通りで解く( if 文 8 個)
――――――――――――
25:20 B問題 問題【図示】
配列 S の中から配列 T を探す
30:40 入力例1を見る【図示】
条件式が何か分からない
40:25 分からないなりに、自分ならどう考える?【図示】
繰り返し条件に悩む
1:07:35 コードを書く
入力 string
発見したら座標を追加 vector pair
発見回数 vector
1:41:35 現状を整理【図示】
1:50:10 初 tuple で解いてみる
繰り返し条件に悩む(時間終了)
2:05:30 再考【図示】現状の確認
2:31:20 コードを書く
3:08:25 再考【図示】sort をしてみる
3:28:30 ギブアップ(´Д⊂ヽ
――――――――――――
3:29:00 順位表
3:30:00 A問題解説を確認する
3:32:20 【図示】4通り?
3:37:00 B問題解説を確認する
3:38:55 【図示】
4:14:00 条件の読み方(問題文の式)を確認する
――――――――――――
うーーん
おやすみなさいl||li(っω`-。)il||l良い夢を
猫は元気です
アバター:nizima.com/Item/DetailItem/98640
ボイスチェンジャー:www.roland.com/jp/products/vt-4
歌唱曲 ――――――――――――
@otakara_BGM :ua-cam.com/video/U-a4putumCo/v-deo.htmlsi=biCt_mhOgfLbRNnu
BGM ―――――――――――――
なぐもりずの音楽室:
www.youtube.com/@UCj_YkzMARTVs3pNmNoKY2-Q
音楽:zippy
www.youtube.com/@zippysound
Neighbor Eight Sound
neighbor-eight.booth.pm/items/5835167
BGM えんぶらー ――――――――
the path of my life - mini album
bluembler.booth.pm/items/4826502
Ocean in Call - Embler 3rd album
bluembler.booth.pm/items/3375338
Eternity Ravine -revelated- Embler 1st album 完全版
bluembler.booth.pm/items/2907044
Wings for - Embler 4th album (DL版)
bluembler.booth.pm/items/5120988
Embler
bluembler
つきこ
tsubaki_hachi
くーにゃん
maplevanilla30
rune
0x0rune0x0
まめらー
mamera1129
Miu.
Sr_MiuMiu
とーず
tomatoze_
乃葵
noa14236
Slushy
slusluslushy
www.foriio.com/slusluslushy
兎角Arle
arlequin.chimanako.net/
Melefiele
melefiele-official.bitfan.id/
【曲タイトル/エルム凪】 ――――――――
・販売先BOOTHのURL:
【ミニアルバム】心紡ぎ:
erumunagi.booth.pm/items/5063116
Ents'tr vol.1 /ミニアルバム
erumunagi.booth.pm/items/5544381
・エルム凪UA-cam:www.youtube.com/@erumunagi
Переглядів: 554
Відео
【AtCoder】ABC390【灰】C++
Переглядів 853День тому
24回目の参加。123(-10) 初マイナスです。 入力例【は】正解しました・・・ \\0完 // C ―――――――――――― 【AtCoder Beginner Contest 390】 atcoder.jp/contests/abc390 次回: ua-cam.com/video/mCqUxjyErAM/v-deo.html 前回:ua-cam.com/video/6olSuKaERgk/v-deo.html †┌┘墓└┐† 0(:3 )~ =͟͟͞͞('、3)_ヽ)_ ―――――――――――― 4:30 A問題 問題 一度だけ【隣り合う数】を入れ替えて 「12345」になるか判定 WAx2 隣り合う条件を修正できず ―――――――――――― 33:05 B問題 問題 等比数列か判定 WAx2 差を比較して多分、型と誤差 誤差の処理:範囲を小さく絞って比較する...
AtCoder Daily Training EASY【灰】2025_0122_2000【C++】
Переглядів 27114 днів тому
鍛錬。 手法が分からないなら 今の自分ならどう解くか、という事を考えながら C問題の練習をする デイリークエスト 目標はC問題レベルを今の自分のレベルで考えてみる事 そういえば1文字目と2文字目が同じであった場合を想定していなかった 次回 → 前回 → ua-cam.com/video/i9ZiIzVVyPY/v-deo.html AtCoder Daily Training EASY ―――――――――― 2025/01/22 20:00start atcoder.jp/contests/adt_easy_20250122_3 出題された過去問題 ―――――――――――――― ABC 349 C問題 : 2024-04-13 (Difficulty 219) atcoder.jp/contests/abc349/tasks/abc349_c ―――――――――――――――――――...
【AtCoder】ABC389【灰】C++
Переглядів 53614 днів тому
23回目の参加。133( 2)牛のような歩みで・・・ C問題、悔しい・・・ \\2完 // C ―――――――――――― 【AtCoder Beginner Contest 389】 atcoder.jp/contests/abc389 次回: ua-cam.com/video/HtVZKW0kFtE/v-deo.html 前回:ua-cam.com/video/os8XihOhyc0/v-deo.html うーん、ノイズ除去の音質が・・・ ―――――――――――― 7:29 A問題 問題を解く stringを一文字取得するとchar!(੭ु´・ω・`)੭ु⁾⁾ ―――――――――――― 14:05 B問題 問題を読む 🐍階乗! 1 から n までの全ての整数の積 3!=3×2×1=6 16:40 ~電卓中 19:10 階乗 C で検索する 21:10 コードを書く...
振り返り【C問題】ABC388 【灰】C++
Переглядів 33921 день тому
1:14:35 二分探索まとめ 3:47:15 尺取り法まとめ 尺取り法・・・難しい 間違いあるかもしれません そうか…尺取り法は、値と添え字で動いているから認識しにくかったのか 2:47 2分探索TLEの要因 #️⃣ define _GLIBCXX_DEBUG 11:15 BAC388 C問題の振り返り 1:25:20 尺取り法 四苦八苦 2:58:20 書き直しラスト 海賊王とポケモンマスターが混ざってるかも 3:11:55 尺取り法…?どの部分が? 3:23:45 お餅で表してみる 参加回 ABC388 ua-cam.com/video/os8XihOhyc0/v-deo.html 問題: ABC388 atcoder.jp/contests/abc388/tasks/abc388_c 二分探索のC 20で範囲を決めるなら、範囲を作るためのやり方があるから、それでやれるかも...
【AtCoder】ABC388【灰】C++
Переглядів 45121 день тому
22回目の参加。131( 4) C問題、難しい・・・ 尺取り法はまだちゃんと勉強していません \\2完 // C ―――――――――――― 【AtCoder Beginner Contest 388】 atcoder.jp/contests/abc388 次回: ua-cam.com/video/6olSuKaERgk/v-deo.html 前回:ua-cam.com/video/lfuHmxLhwxc/v-deo.html RLEをとりあえずやるmanしていますね・・・ 型の適切な選択はまだできていない 9:20 A問題 問題を解く 頭文字と指定の文字を出力する 11:40 B問題 問題を読む ―――――― ヘビのヘビーの最大値を求める🐍 19:55 B問題 コードを書く 33:10 C問題 問題を読む ―――――― 鏡餅の組み合わせの数を求める 38:30 C問題 入力例...
振り返り【D問題】グリッド問題 ABC387 BFS 【灰】C++
Переглядів 29828 днів тому
まとめ 1:38:35 queueへの理解が少し深まった(; ・`д・´) 一般的にqueueは一つでBFSを行う事。 2つを使う場合はBFSの応用であるようでした。 BFSへの理解と、条件の処理をうまくやらないといけないので 自分には難しい方法だったようです(-_-;)滝汗 前回振り返り(ABC383 BFS) ua-cam.com/video/CfnH-jZSTH4/v-deo.html 参加回 ABC387 ua-cam.com/video/lfuHmxLhwxc/v-deo.html 問題: ABC387 atcoder.jp/contests/abc387/tasks/abc387_d 00:40 問題: 移動方向が縦と横を交互に繰り返しながら最短の移動回数を求める 02:40 BFS 幅優先探索の復習 10:00 現状の問題点 自分がどういうことをしていたのか...
【AtCoder】ABC387【灰】C++
Переглядів 479Місяць тому
21回目の参加。127( 13) 2025年あけましておめでとうございます! コツコツ楽しみながらがんばろう(;´∀`)9 振り返り:queue2個使ったBFS(幅優先探索) ua-cam.com/video/vEnCckoKBSM/v-deo.html \\2完 // C ―――――――――――― 【AtCoder Beginner Contest 387】 atcoder.jp/contests/abc387 次回: ua-cam.com/video/os8XihOhyc0/v-deo.html 前回:ua-cam.com/video/8mN94MZGjLU/v-deo.html C問題が解き方まったく思いつかなかったので D問題を試してみました(長時間&誤答)(´Д⊂ヽ 4:30 A問題 問題を読む 6:40 A問題 回答 8:40 B問題 問題を読む ―――――― 11:2...
【AtCoder】ABC386【灰】C++
Переглядів 418Місяць тому
20回目の参加。 今年は大変お世話になりました 来年も楽しく学びながらよろしくお願いします 思考がぐるぐる、手を変え品を変えて A問題:ごり押しAC B問題:2転3転countリセット方法を変え 滑り込みAC_(┐「ε:)_瀕死 \\2完 // C ―――――――――――― 【AtCoder Beginner Contest 386】 atcoder.jp/contests/abc386 次回: ua-cam.com/video/lfuHmxLhwxc/v-deo.html 前回:ua-cam.com/video/-aqqHB k4/v-deo.html 過去に多様な問題があったので もっとスムーズに解きたかった(ほぼ忘れている) 3:05 A問題 問題を読む 26:35 A問題 回答 28:00 B問題 問題を読む ―――――― 29:40 B問題 考える 前後1文字ずつ...
queueの問題を見に行く【D問題】ABC377【灰】
Переглядів 233Місяць тому
queueを工夫して使う問題をやってみました。 レベルが高いので、解けなくてもQueut(キュー)を使ってみるのが目的です。 TLE(時間オーバー)で解けませんでした(;´∀`)=3 どのデータをどう扱うか、考えるのは難しい!! 後で思い出したのは、連長圧縮は、要素数が1の時はむしろ無駄が多くなるという事です。 AtCoder Beginner Contest 379 D問題 atcoder.jp/contests/abc379/tasks/abc379_d 2:30: 問題を読む 21:10 コードを考える 49:45 コードを書く 1:02:05 デバッグ 1:28:25 最後の確認 1:30:15 回答 TLE x1 1:32:15 処理を軽くする方法を考える 連長圧縮(れんちょうあっしゅく) (ランレングス圧縮、RLE (Run Length Encoding...
振り返り【B問題】グリッド問題 ABC383 BFS 【灰】C++
Переглядів 217Місяць тому
幅優先探索を確認しながら、コードをまず知るところから。 mapは使用しませんでした。 振り返り用 まだ幅優先探索は手書きでやってみた段階です。 一呼吸おいてから、過去問を実際に取り組んでみます。 前回(ABC383B set pair版) ua-cam.com/video/ZKmaa2H_rTM/v-deo.html 参加回 ABC383 ua-cam.com/video/NQkKJ-97PH0/v-deo.html 問題: ABC383 atcoder.jp/contests/abc383/tasks/abc383_b 2:50 問題の概要 4:15 今の知識レベル 6:00 関数にしたら実行速度が早かった話 4:45 set と pair の場合の、動きの復習 26:35 定数 方向計算用変数 36:20 入力 グリッドサイズ、指定距離 38:10 入力 床情報 vector s...
AtCoder Daily Training EASY【灰】2024_1225_2000【C++】
Переглядів 260Місяць тому
鍛錬。 stringから1文字を操作するのが苦手なのが分かりました。 B問題Difficulty220 2時間かかりました(-_-;) stringの操作をメモをする… デイリークエスト 目標はA問題レベルを2問をAC → クリア 次回 → ua-cam.com/video/kxLj4ohJfQw/v-deo.html 前回 → ua-cam.com/video/NZbI5Tplcic/v-deo.html AtCoder Daily Training EASY 2024/12/25 20:00start atcoder.jp/contests/adt_easy_20241225_3 出題された過去問題 ―――――――――――――― ABC 366 A問題 : 2024-08-10 (Difficulty 20) atcoder.jp/contests/abc366/tasks/a...
振り返り【B問題】グリッド問題 ABC383 【灰】C++
Переглядів 183Місяць тому
加湿器を二つ置いて、加湿できる最大のフロア数を求める 距離はマンハッタン距離で計算する ループの使い方を振り返り確認用 グリッド問題のプログラムの作りとコードの書き方を勉強する pairとsetの使い方を学ぶ 2点の位置を考える場合のプログラムの作り方を勉強する 忘れないように時々見直し用 2点を決めて、各床の状態を判定する。を、繰り返す 幅優先探索は持ち越し 参加回 ua-cam.com/video/NQkKJ-97PH0/v-deo.html 問題: ABC383 atcoder.jp/contests/abc383/tasks/abc383_b ABC383 ―――――― set pair 4:20 問題を見る ▶コードを読み解く 10:00 関数 マンハッタン距離 27:25 入力 グリッドサイズ、指定するマンハッタン距離 30:40 入力 地図(グリッド情報)vector ...
【AtCoder】Xmas Contest 2024【灰】C++
Переглядів 304Місяць тому
絵を描く4時間(;´∀`)過去問を確認せず参加 とりあえず今のレベルで、参加したから考えてみた回 Xmas Contest 2024 atcoder.jp/contests/xmascon24 ひたすらクルシミマス もっと勉強した数年後に見直すと、成長を感じられるようにはなりたい アバター:nizima.com/Item/DetailItem/98640 ボイスチェンジャー:www.roland.com/jp/products/vt-4 歌唱曲 ―――――――――――― @otakara_BGM :ua-cam.com/video/EvIZLrcRj8U/v-deo.htmlsi=ott6Bsw06VgEE80s BGM ――――――――――――― なぐもりずの音楽室: www.youtube.com/@UCj_YkzMARTVs3pNmNoKY2-Q 音楽:zippy www....
振り返り【B問題】グリッド問題 ABC 364 _ 385 【灰】C++
Переглядів 258Місяць тому
グリッド問題のプログラムの作りとコードの書き方を勉強する pairとsetの使い方を学ぶ 忘れないように時々見直し用 参加回 ABC385:ua-cam.com/video/-aqqHB k4/v-deo.html 問題: ABC 364 atcoder.jp/contests/abc364/tasks/abc364_b ABC 385 atcoder.jp/contests/abc385/tasks/abc385_b ABC364 ―――――― vector 11:00 問題を見る ▶コードを読み解く 21:30 入力 グリッド幅、初期座標 30:25 入力 地図(グリッド情報)char 49:50 入力 移動指示 51:55 処理 移動指示・現在の座標の代入(移動処理用) 59:20 処理 次の移動座標取得 1:10:45 処理 次の座標に移動できるか判断 1:31:45 処理...
AtCoder Daily Training EASY【灰】2024_1120_2000【C++】
Переглядів 2112 місяці тому
AtCoder Daily Training EASY【灰】2024_1120_2000【C 】
AtCoder Daily Training EASY【灰】2024_1119_1930【C++】
Переглядів 2482 місяці тому
AtCoder Daily Training EASY【灰】2024_1119_1930【C 】
AtCoder Daily Training EASY【灰】2024_1114_2030【C++】
Переглядів 2062 місяці тому
AtCoder Daily Training EASY【灰】2024_1114_2030【C 】
AtCoder Daily Training EASY【灰】2024_1113_2000【C++】
Переглядів 2282 місяці тому
AtCoder Daily Training EASY【灰】2024_1113_2000【C 】
AtCoder Daily Training EASY【灰】2024_1030_2000
Переглядів 2633 місяці тому
AtCoder Daily Training EASY【灰】2024_1030_2000
find、イテレータが帰ってくるんだよね。 あと、Bみたいなのは範囲外参照が怖いから、そういう部分は自分の中でこういうふうに書くのが良いって決めて、ほぼ暗記的に書くのが良いよね。将棋で言う定石みたいに、ほぼ頭使わなくても書けるように。
イテレータをインデックスで使いたかったのですが、検索ワードが頭の中で考えられなかったことと、メモに残していたfindの項目で残していなかったので断念しました😓 std::distance(vec.begin(), it) ⇐イテレータをインデックスに変換 すぐに見つけられるようにここで使いたい!っというところに今回は忘れずに記載してきましたil|li (´ω`) il|li
@@WillowLog まあでも単純にfor文で比較しながらでも良かったのかも?
いろいろ難しく考えすぎたようですね B問題の読み落とし私もです。そのせいで時間がかかってしまったW A問題、8方向の図を書いた時点で、WillowLogさんのACコードのように愚直に書けばもっと早く回答できたと思う find()を使おうとしたことが悔やまれる あと、2つのベクタを使う場合でも、よくわかってないfind()を使わず、 for文で回して、一致したら解を出力して終わるか抜ければよいので、混乱せずに済んだと思う B問題、SのシートにTのシートを重ねて、パターンが同じにできるならYesという感じのイメージで Sの各マス(N*Nマス)全てについて、判定する Sの(a,b) のマスをTの左上角(i,j)=(0,0)のマスとしてM*Mマス調べて 全マス同じならtrue、1つでも異なればfalse 4重ループの混乱を避けるため、判定という大きな一塊の処理を関数にして簡素化する 以下にコード書いときます 範囲外参照対策に公式のコードでは、a,bの範囲に工夫がありますが 以下のコードは工夫はせずに、判定時に範囲外参照をfalseとして返してます ```cpp // おまじないとrepマクロを追加 int N, M; string S[50], T[50]; bool same(int a, int b) { // S[a][b] を左上角として T と同じか判定 rep(i, M) rep(j, M) { int k = a + i; // S の index int l = b + j; if (N <= k) return false; // 範囲外 if (N <= l) return false; // 範囲外 if (S[k][l] != T[i][j]) return false; // 同じでない } return true; } int main() { cin >> N >> M; rep(i, N) cin >> S[i]; rep(i, M) cin >> T[i]; rep(a, N) rep(b, N) if (same(a, b)) { cout << a + 1 << ' ' << b + 1 << endl; return 0; } } ```
深いループは自分の頭では混乱するので、同じような問題が出るかは今はわかりませんが、未来の自分に向けて関数として残しておこうと思います。 コードありがとうございます!勉強になります!🙇 find 、まえにイテレータをインデックスにできるという記憶だけが残っていたので、今回は使えるまでには至りませんでした。必ず検索する場所(findの項目)にメモを残して、暗記していなくても調べたらわかるようにして、使追うと思った時に使えるような用意をしておこうと思います。
ありゃ、B解けませんでしたか。 ざっと飛ばし飛ばしで画面に見えたものから判断するに、無駄に難しい方向に突っ込んで行きましたかね? AHCは、最低限AC可能(ただし超低得点)なサンプルコードは問題に掲載されているので、それをほんのちょびっと改良するだけとかでも参加できます。 ABCとは競技の方向性がかなり違っていて、楽しいですよ。
解き方を見た後だと、AB共に難しく解こうとしていました🫠 AHC、参加はまだ早いと思うのですが、考えるの楽しいのかなと、あーだこーだをちょっと見た時思いました。
全体視聴後。 B問題、謎の数式で悩んでいたようですが、実はこれ、読む必要全くありません。 実際、私はコンテスト後に初めて「へえー、B問題にこんな数式書いてあったんだ」となりました。 以前も同じようなコメントをしたような気がしますが、「すなわち」「具体的には」のような文は、前の文が曖昧で理解できなかった人用に厳密さ重視で同じ内容を書き直しただけです。 「Tを探してください」と言われて「は?Tを探すって何をすればいいの?」ってなった人に「じゃあ難しい言い方になるけど数学的に厳密に言い直すわ」してるだけです。 だから、「Tを探してください」と言われて「うん、わかった」になった人は、「具体的には」を読んでも得られる情報は特にないんです。 32:15時点で、willowさんは「Tを探す」の意味を理解しました。 ということは、32:32から40:21までは、完全に何の意味もない時間です。 例えるなら、タクシーで東京駅に着いたあとで「東京駅へはどの電車乗ればいいんだろう……路線図の見方わからん……」って悩んでいるような行為をずっとしてるだけです。 いやその路線図もう要らんのよ。 47:19からの考察、完璧です! これをそのままコードにすればACです! 私もこの3重ループ内でsubstr使う方法で解きました、おそろいですね! ……そこからどうしてこうなってしまったのか。 56:58からあと一歩前進すればすぐに模範解答のようなACが目の前だったのに。 ところで、コードに全角文字でコメントを書き足してるときに変換候補が映ってますが、ここにうっかり「鈴木」とか「東京都千代田区」とか出ちゃう事故起こりません? 大丈夫ですかね?
競技中、前に条件の式について指摘があったので、わかるまでコードを書かないというようなことをしないように考えておりました。しかし4重ループと条件に混乱して、式から解決を得られないかと…😓 読み取れるものが多くなれば、いざというとき自分の助けになルノではとは思っています(理想 全角の変換が気になって、ちょっと候補を見てみたのですが、現状は大丈夫・・・だとは思いますが、検索ワード履歴やGoogle検索の表示が危険だとおもいます。あとキーバインド?で意図しない表示が出てしまったりでしょうか。 アップロードしている時に、タイムスタンプを作るとともに、一度内容をチェックしているのですが、気がついたところではカットしたことはあるのですが、気が付かなかった場合は危ないですね😓
B問題ですが、誤差の出ない有理数ライブラリを使うという方法もあります。 前提として、有理数ライブラリの使い方を知っている必要がありますが… 実際にboostの有理数ライブラリを使った回答例がこちらになります。 abc390/submissions/62120667
有理数ライブラリを調べてみました。 少しクセがあるようなので、扱えるようになるにはもっと時間がかかるかもしれません😳 コードは通るようなので、機会があるときに、練習時に使ってみようと思います! コードありがとうございます!勉強になります!
今回は難しかった...単純なforや出力だけで解ける問題がなかった。 ひとひねりしないと回答できない... 自分はABまでしか解けませんでした... あと、タイトルがABC389ですよ
😳390に修正します!ご指摘ありがとうございます!! Aでも点数が高いものはまだ解けなかったり時間がかかることがあるので、地道に・・・
B問題「前割る後ろが常に同じ」という結論に至れたのいいですね A問題、実際にやる方法が取れるとよかったですね。 「配列の要素を入れ換える」 →「チェックする」 →「もとに戻す(最初と同じ場所を入れ換える」 入れ換える候補はi番目とi + 1番目になるから、計4回これをする感じです。 配列の要素を入れ換える関数の使い方(もしくは作り方)は調べれば出るので、知らない場合は調べていきましょう。 ちなみに、他の方が言っているBの式変形は紙に式を書きながら確認してみると納得が出来ると思います。 たとえば、「2,4 ,8,16」や「200,100,50,25」のような等比数列、「2,3,4,5」のような等比数列でないパターンで書いて見ると納得できるはずです。 B問題で出てくる、 x/y = a/bを 意味の等しい x * b = a * y に変える工夫は便利なので、「少数やだなあ」と思ったときに思い出しましょう
解き方色々あるので、複雑ですね(´-ω-`) swap、解説で見かけるだけで、いざその問題だ!っという時にswapを使うまたは使えたことがまだないような、、、(曖昧 条件が増えるA問題も、まだまだです( ˘•ω•˘ ) 割り算も、素直にするとまずいと思えるところから・・・ アドバイスありがとうございます!
式変形になれるために、中学一年生の数学の教科書などからはじめてみてはいかがでしょうか? willowlogさんの動画は時々拝見しますが、数式へのアレルギーみたいなものをめっちゃ感じます。 A問題、B問題で使うような式変形は中学一年生の最初の単元ができるようになるだけでもとても分かりやすくなるので試して見てくださいね!
数式を見るだけで「数学は分からない」と言って脳みそがフリーズしてしまうのはとてももったいないと思います。せっかく難しいアルゴリズムを一生懸命お勉強されてるのでその時間を少しでもいいので数学に分けてやってください!
中学数学と検索で出てくるたびに「こんな項目やったかな…?」と思う昨今です🙃 前に中学数学を学び直した事があるのですが、目的なくやったのでそれ以来使用しない生活であったので忘れてしまったのですね…
A問題、肝心な一行抜けてて沼てっしまったW WillowLog さんが提出されたコードでWAとなるケース書いときます i:1 2 3 4 5 A:5 2 3 4 1 ans=No これが Yes になってWA iとA[i]を比較すると、隣り合ってなくてもcountしてしまう! あくまで隣と比べないとダメ A問題考えてるとき、swapを口にしてて惜しい! 隣り合う組は(a1,a2)(a2,a3)(a3,a4)(a4,a5)だから これらを入れ替えたら[1,2,3,4,5]になるか判定すればいい! B問題、公比が実数になるパターン忘れてて、入力例3で?ってなったw 入力例2の説明のとこみて、判定方法に気がついて通した 数学の問題だから、前提知識が必要 a:b=c:d とか書いてるのは比を表していて、a対bはc対dと比(割合)が同じということ このとき a/b=c/d と式にできる このままでは実数になってしまうので a*d=c*b と式変形して判定に使う 等比数列では A[2]:A[1]==A[i+1]:A[i] となれば A[2],A[1] と A[i+1],A[i] の比は同じ これが全ての i と i+1 に言えれば等比数列と言える このとき A[2]/A[1] が等比数列の公比 r になっているはず A[2]:A[1]==A[i+1]:A[i] これは A[2]/A[1]==A[i+1]/A[i] と書け A[2]*A[i]==A[i+1]*A[1] と式変形できるのでこれで判定 あとは i+1 を範囲外にならないよう気をつければよい って感じでやりました 実数で処理すると誤差でやられるので、式変形で逃げるのはあるある!
式変形で対応する問題は、あるんですね! 出会うのをドキ( º言º; )ドキしながら楽しみにしようと思います。 数学、わかるとかんたんな問題なのでしょうか😅
@@WillowLog 「数学、わかると~」って言われると、「う~ん…」となってしまいますね どこまで、わかれば…って感じ(つらいw) 比は小学生、等比数列は高校生で習うようなので、この問題ではこの範囲でとは言えるかな? ただ、今回の式変形は、数学で文字式をいじっているぶんには割り算のままでいいわけで、 情報の世界で実数ヤバいみたいな知識があって、式変形しとくかってなるし…なんとも
A[i+1]/A[i] = A[i+2]/A[i+1] から A[i+1]の2乗 = A[i] * A[i+2] に変形される部分 左の式の両辺にA[i] * A[i+1]を掛けると右の式になります。
アドバイスありがとうございます! こつこつ、、、メモをして行きます_φ(・_・;
お疲れ様でした。 今回難しかったですよね。 B問題が、「double型の欠点を知ってないといけない」+「その回避には等比中項という話をしらないといけない」のコンボでwillowさんにはちょっと厳しかったかもしれませんね。 Aは、油断で足を掬われましたかね? そして、C問題がグリッド問題だったので、willowさんには一番楽だった説。
willowさんの解答方針に合わせた解説おいときます。 A問題 ちょうど1回の入れ替えで昇順になるということは、本来の位置と違う位置にある数がちょうど2つであることと等価です。 あとは入れ替えが隣り合うもの限定であることをどう取り扱うかですが、「隣り合うものの入れ替え1回で揃う」を「入れ替え1回で揃い、しかもその入れ替え位置が隣同士である」と考えることで実装できます。 B問題 隣同士での割り算が全て同じ答えになるか確認するコードを書けば正解の99%までたどりついています。(2回目の提出がこの段階) 残り1%の問題点は、double型は==の判定が信頼できないこと。 例えば「1/3=0.333333と10/30=0.33333は、3の個数が違うから等しくない!」のような感じで、割り切れない計算を打ち切る都合で差が発生してしまう場合が稀にあるからです。 よって、割り算の結果が等しいことの確認をしたい場合、どうにかして割り算せずに行わなければなりません。 a/b==c/dはa*d==c*bと等価であることを利用しましょう。 B問題の1回目と3回目の提出は、saが小数を扱えない型だったためにnowの値を正しく引き継げなかったことが原因ですね。 2回目の提出はnもdouble型にしてしまった悪影響があるかもしれないので、再挑戦のときにはぜひ再度しっかり型の確認をしましょう。
型の選択、難しいですね。 この方でも良いのではないか?っと思って設定してみると 良くない挙動をするかもしれないので 使いながら、少しずつ型の動きに慣れていかないと・・・(´ㅂ`; )
聞いてー✨️✨️ 入茶しましたー🤎🤎🤎 やったー✨️✨️✨️
入茶おめでとう御座います!🥳㊗️🥂🍾 °˖✧⁽⁽◝(⁰▿⁰)◜◝(⁰▿⁰)◟₎₎✧˖°
あー、残念。というか今回は難しかったですよね。 私もA問題とB問題で1回ずつWAしてしまいました。 A問題:問題文に「隣り合う 2 つの項」とあるのに「隣り合う」を見落としていた。入力が "2 1 3 4 5","1 3 2 4 5","1 2 4 3 5","1 2 3 5 4"のうちいずれかであればYes、そうでないならNoでした。 B問題:前項で割り算して答えがすべて同じならYesだと思っていたら除算に伴う誤差でWA。これはWAしたときに気づいた。B問題にしては難しくないか? C問題:これは普通にできた。 D問題以降、まるで歯が立たず・・・でした。 お互いがんばりましょう。
A問題の「隣り合う」については引っかかった話がXとかでもありました🫣 数が多い割り算については全く対応できませんでした。こういう時は小さい範囲で確認するんですね🥲
お疲れ様です! Tは3文字。T = C1C2C3とする。 C1,C2,C3の小文字をそれぞれc1,c2,c3とする。 (i) C3 == 'X'の場合 c1,c2がこの順でSに含まれているならばtrue (ii) C3 != 'X'の場合 c1,c2,c3がこの順でSに含まれているならばtrue 文字列Sを先頭から1文字ずつ走査していって、文字c1と合致するか判定する。 合致すれば、照らし合わせる文字をc2にする。
録画を終え、アップロードしている間にタイムスタンプを振り返りながら作り、公開したあとで携帯で再度見て・・・ 重複・・・のケースを失念していたっ!!!\(^o^)/悶絶 T3文字、変数に入れてチェック!! その思考にたどり着けるよう、この衝撃を次への気付きへの経験値として積み重ねていきたいです😇
おつかれさまでした。序盤でsetの沼に入ってしまったのが敗因でした。
3文字側で、同じ文字を扱う可能性を完全に失念してしまいました😇
いろいろ迷子になったり変な道を爆走したりしていたようなので、アシストっぽい内容をいろいろ。 4:20 素晴らしいとこその1。 自分ができない問題を、きっとできないとわかっていても挑戦するって、意外と難しいんですよね。 一番成長につながることだとわかっていても、どうしても腰が重くなる……。 それをこんなにも当然にこなせるwillowさんの心の持ち方を、私含めみんな見習うべきですね、本当に。 17:15 悩んでたとこその1。 部分列は、「適当にいくつかの文字に印をつけて、それらの文字だけ前から読む」くらいのイメージがわかりやすいでしょうか。 定義で間隔についての言及がないというのは、間隔についてはどんな様子でも構わないということです。 今回の問題をわかりやすく言い換えれば、 「Sの文字列の中で3つの文字に印をつけて、それらを左から順に読んで大文字化することでTに一致するものを作れますか?あるいは(以下略)」 という問題だったわけですね。 部分列の例もいくつか挙げておくと、 “willow” の部分列には “wil” とか “iw” とか “willw” とか “o” とか “ww” があります。 定義上、全部印をつけた “willow” と、印を1つもつけない “” も部分列です。 元々ない文字を含んでいる “wa” や、元々の個数を超えている “www” や、順番を変えないとできない “wlwl” などは部分列ではありません。 n文字の中の部分列を全探索すると、個数の制限がなければ O(2^n)、r文字の部分列に限るなら O(n^r)。 いずれの場合でも単純に全探索すると計算量が爆発しがち。 今回はr=3なので、部分列を全部作ってみるのはO(n^3)になって御陀仏です。 28:30 悩んでたとこその2。 vector<char>はおそらく使いどころがないです。 少なくとも私は、水色昇格までに一度も使ったことがないです。 vector<char>でできる処理はおそらく全部stringでもできるので、わざわざ下位互換を使う理由が……。 31:25 やらかしその1。 重複がなくなっちゃうのはダメですね。 同じ文字が2回目や3回目に出てきたところを使う必要があるかもしれないからです。 例えば “willow” に対して “ILL” や “IOW” が空港コードの条件を満たすかどうかは、どちらも正しくはYesですが、重複を消すと誤ってNoとしてしまいます。 今回のWAの大半はこれが原因じゃないかな? 36:20 やらかしその2。 unordered_set はソートしない、の意味を誤解していますね。 ソートしないというのは、順番に関する作業と保証を全て放棄するという意味です。 C++くんの気まぐれ順に並べられると言い換えてもいいと思います。 willowさんの手元のC++くんは完全な逆順にしがちだったようですが、AtCoderの方でも同じ挙動になるかどうかは不明です。 1:53:13 素晴らしいとこその2。 10^5が、1重ループは回せても2重ループは回せないという感覚を持っているのはすばらしいですね。 まだTLEと戦った経験量が少ないうちからその感覚を持てるなら、3完常連もそんなに遠くないかもしれませんね。 今回も、目の前にぶら下がってる超単純な3重ループを最初からスルーしてますけど、灰色でそれできる人はそう多くないと思います。 2:06:00 悩んでた(?)とこその3。 差分の吸収だけが目的なので、大文字に揃えても小文字に揃えてもいいです。 短い分Tを小文字にする方がいいと考えられたのはセンスあり。
たくさんのアドバイスありがとうございます😳! unordered_set は前に、あまり良くないとコメントであったのは思い出して履いたのですが 使ってみたことはなかったので、このときの自分の要求する動きをするかも? っと思い使ってみて、思った挙動ではなかったですが、使えそうだな・・・ っとおもったのですが・・・そもそも消してはいけなかった😭 Sについてケースを色々考えてみたのですが Tのケースの考えが足りなかったです ぼこぼこにやらかしましたが、良い点のご指摘で少し元気になりました、ありがとうございます!
「お!これ簡単そう」ってことで、サクッとコードを提出して WA でしたW 雑すぎる~ 公式解説のpythonのコードcppで書いてみました ```cpp 先頭のおまじない追加してください using namespace std; bool check(string S, string T){ int n = size(S); int pos = 0; // S の検索位置 for(auto t: T){ t -= 'A' - 'a'; // 大文字と小文字の差分から、大文字を小文字に変換 while (pos < n && S[pos] != t) pos++; // t と同じ字が見つかるまで前進 if(pos == n) return false; // 途中で尽きた pos++; // 見つかった位置の次から、次の t を見つける } return true; // 全部探せた } int main(){ string S,T; cin>>S>>T; if (T[2] == 'X') T.pop_back(); // 3文字目が X なら、判定の必要がないので if(check(S,T)){ puts("Yes"); }else{ puts("No"); } } ```
Xのとき、Tの三文字を消すと、処理がスッキリ!😳 ifの条件に関数の戻り値!!😳!! 関数便利なことが多いのですが、作りなれずためらってしまいます((😓)) 一回調べればよくシンプル・・・C++コードありがとうございます!
おつかれさまです! そういえばこのチャンネルで貪欲法って登場したことなかったですね。 BFSとか尺取法なんかよりずっと前に習得すべきものな気がしますがw 貪欲法の解説、いります?
貪欲法、解説動画で名前をお見かけすることはありましたが 問題として解く問題に登場することはなかったと思います (もしくはあってもわからないor忘れている) 貪欲法も含めて自分が理解するには、結構動画や画像を使った説明サイトを複数見ないと、自分には難しいので書かれた内容を理解するには予習が必要になるかもしれません。 ABC389で紹介していただいたAOJ(onlinejudge.u-aizu.ac.jp/home)でまず試してみようと思っています!ご提案ありがとうございます!🙇
あ、そうそう。 貪欲法はABCとかで使うタイプとAHCとかで使うタイプがあります。 今回必要なのは前者。 単純にググるとごちゃ混ぜになって出てくるのでお気をつけて。
別の目的の作業ついでに、最近の出題のAからCまでの問題で貪欲法を使うやつを探してきました。 意外といっぱいありました。 ABC379B - Strawberries(難易度39) willowさん正解済、しかも貪欲法を使う解法をしています。 ABC386B - Calculator(難易度42) willowさん正解済、ただし貪欲法は使わない解法で答えています。解法が複数あり、解説の解法1が貪欲法を使っています。 ABC363B - Japanese Cursed Doll(難易度32) willowさん過去挑戦で誤答。わりとシンプルな貪欲法です。 ABC376C - Prepare Another Box (難易度366) willowさん未解答。解法が2種類あり、片方が貪欲法です。 (貪欲法とは関係ないですが、以前撃沈したABC377Cが、setさんと仲良くなった今なら行けるのではないかと思ったり) また、AOJの貪欲法のところを解いてみました。 ALDS1_15_A ABCのB問題レベルです。 willowさんでも雰囲気でコードを書いてAC取るまではできるでしょう(所要時間はさておき)。 ただし、これがその解法でいい理由まで説明できて初めて合格とするならわりと大変です。 問題文の「25セント」を「26セント」に変更するだけで急に激ムズ問題になる、と聞いて「そりゃそうだよ」と思えたら、貪欲法を理解できていると判断していいと思います。 ALDS1_15_B ABCのB問題レベルです。 こっちはしっかり貪欲法を理解していないと難しいでしょう。 でも貪欲法でうまくいく理由を考えるのはAより簡単。 若干数学的(というか算数的)要素あり。 ALDS1_15_C ABCのD問題レベルです。 問題の意味するところはわかりやすいので、お絵描きはしやすいと思います。 ただ、実装が簡単かは……? 貪欲法だというヒントをもらってスタートならABCのB問題かC問題レベルかも。 ALDS1_15_D ABCのE問題レベルです……たぶん。(このレベルになると自信なし) 数学的ないろいろがわからないとまず問題が意味不明じゃないかと思います。
WillowLog さんの思い描いた処理を再帰で実装すると、こちらのようになると思います(解説のコードをベースに作成)。 abc384/submissions/61882926 ポイントは、名前と点数を再帰関数の引数にすることと、結果をグローバル変数に push_back することです(結果を戻り値で返すのは大変なので)。
C問題は知っているかどうかの知識問題でしたね。
こういう問題は慣れていない今の自分には、とても分かりやすく勉強になりました😄!
視聴後に改めて気付いた点をコメント A問題 1:50:51 willowさん「char型をint型に変更して……」 コードくん「char型に変更して……」 実は、int型変数にデータを格納する時に型が違ったら自動的にcastしてくれるので、自分が手を動かして型変換の指示をする必要はなかったり。 ここで型の変換先を間違えたのも、こっそりその機能に救われてますね。 B問題 32:29 デバッグログ表示コードのcerrに吐き出すところに手を入れて、デバッグログはデバッグログと自分で区別できるようにしておいた方がいいかもしれませんね。 あるいは、chromeのプラグインを導入して、入力例を自動でテストしてから提出してくれるようにするとか。 1:55:16 21!以降は、Xの値の制約に入り切らないんです。 階乗はビックリするくらい一気に値が増えるので。 とはいえ、具体的に20が限界とはわからなくても「まあ100は行かんやろ」でwhile文回す作戦も十分あり……というか、多分そっちが多数派じゃないかと思います。 C問題 1:26:12 入力例2に惑わされちゃいましたね。 出力がないケースがある→coutをするかしないかを何かで判定しないと! と思ってしまったのでしょうが、実はそんな必要はありません。 ただ出力を求めるクエリが一度も来なければ何も出力せずに終わりますが、それが正常動作ってことで間違いありませんよと言ってるだけなので……。 勉強法の話 chatGPTはあくまで自然な文章を創作してくれるAIであって、正しい情報を伝えてくれるAIではないですからね。 関連する(可能性が高い)キーワードを出してもらう、くらいまでにとどめた方がいいかもしれませんね。 自分の理解が正しいかどうかは、それを使う簡単めな問題に自力ACできるかで確認してみるのがいいと思います。 理解が間違ってるのにACはできるなんてことは滅多に起こりませんし、実際に使ってみる練習にもなりますし。 まあ、解いたことがない問題だけどそれを使うことがわかっている問題ってのを探してくるのが難しいんですけどね。 Aizu Online Judge だと使う技法をタイトルにしてくれてる問題集があるので、そういう勉強には向いてます(私もそれでやりました/今でもやってます)。 ただ、問題ごとの難易度がよく分からないのと、サイト自体がちょっと使いにくいのがなあ……。
static_cast\char/😅嗚呼! char型に変換しているのに全く気がついていませんでした!! デバッグの出力勘違いを時々繰り返すので、対策してみます C問題は自分で条件を追加してしまいました・・・(0のとき表示しない) オンライン プログラミング チャレンジ・・・ onlinejudge.u-aizu.ac.jp/home 会津大学が運営しているオンラインジャッジシステム アルゴリズムを学べるサイト、、、! 競技プログラミングやアルゴリズムのトレーニングに特化している・・・_φ(・_・ ここは手法説明付きなんですね! 使用手法がわかった上で解いてみる、というのは学習するときには助かりますね! 紹介していただきありがとうございます!
B問題、O(N) 相当のコードでAC!おみごと! 自分は、O(N^2) 相当のコードで通してましたw ansを出力せずに提出してたのは残念!もったいない! C問題、おしいね! k番目のヘビの頭 -> k-1番目のヘビの尾 と言い換えればまとめやすかったかな? 尾の座標はヘビの長さの総和だからね 先頭から削除しないとすると、 ヘビを追加する度にそこまでの長さの総和を計算しておけば、 k番目のヘビの頭の座標 = k-1番目のヘビの尾の座標 = k-1番までの長さの総和 で簡単に求められる そこから、削除を考えると、 ベクタから先頭を削除するのが時間的に厳しいので ”どこまで”いらないか(どこまで放したことになっているのか)を持っておいて、 差分から解を計算する で、なんだ累積和を使った範囲和か!ってなる って感じかな? 累積和は最初にベクタに 0 を入れといて、1 番目から追加するようにしておくと いろいろ嬉しいことがあるよ! まぁ、終わってから考えをまとめるのは簡単だけど、 コンテスト中は、私も結構時間かかってとおしたからねw ちなみに、queueでは厳しそうだけどdequeueだと意外と簡単に実装できたりする これも、コンテスト中は思いつかずに普通にベクタで実装したけどねw
dewueueは試していませんが、配列0に0を入れてみると ものすごく考えるのが楽になりました! アドバイスありがとうございます! 似たような問題で思い出せるように頑張らないと、、、! atcoder.jp/contests/abc389/submissions/61862366
@@WillowLog コード見ました sum に相当するものは vec にあるので必要なくなります
おつかれさまです! 2完はもう余裕ですね! 動画待ちの間にwillowさんの提出結果を見てましたが、C問題、おしかったですね。 queueっぽく見せかけてvectorを使わなきゃいけない、までは正しい方向に進んでいました。 あとは、「vectorのここからここまでの和を出して」を大量に処理しなきゃいけないときに使う「累積和」というテクニックさえ知っていればワンチャン3完でした。 明日にでも、累積和の勉強をしながらAC目指せるところに充分たどり着いていると思います。 ぜひ頑張ってみてください! 以下、自語り。 E問題(正解者566人)を解いて5完だったのに、それより簡単なF問題(正解者998人)が間に合わなかったせいでABCDFの5完の人より順位が下なの納得いかねえ……。
知っていることで、できる事が増える・・・ C問題を解けるようになるためにコツコツ頑張ります! AtCoderの順位、現在の認識は 解けた! ⇒ わーい!(*´Д`) 70%以上の人口を占める灰色その1としましては、鎬を削る上位の競技者は人口が少ないので、より競技感がっっ!
自分の未知のものをChatGPTに聞くのは真偽の判別が出来ないので危険ですね
ChatGPTという存在は、真実に嘘を散りばめる詐欺師のようであり、都合の良い偽りの情報など見極められる知性を試されているようであり・・・ わかりやすいと思っても、結果的に現代の正しい知識を得るには不安要素になります(´・ω・`)
イテレータはポインタ"のようなもの" -> ポインタ(メモリのアドレス)ではない! 配列は全てをメモリ上にまとめて配置されるので、ポインタで管理できる。 ベクタは要素の追加を容易にするため、その全てがメモリ上にまとまって配置されるとは限らない。 イテレータは、あたかもポインタのように要素が並んでいるかのように扱えるようにする仕組みで、 使っている側からはポインタとの違いを意識せずにすむ。 って感じで覚えてるんだけど?ホントのところは本職に任せるw あと lower_bound と upper_bound の違いは以下のような感じで覚えてる また幅がズレてるので、エディタにコピって確認してほしい ```cpp int main() { // index: 0 1 2 3 4 5 6 vector<int> A = {1, 2, 3, 3, 3, 4, 5}; // l u <- 挿入したい位置 // ↓処理単位で {} で囲めば、その中の変数宣言は {} の外からは見えない // 例えば (1) と (2) で it を変数宣言してもお互いは知らん顔で問題なし { // (1) // 3 を挿入するとしたら、どこへ挿入するか?を返す // ただし, 同じ値があれば一番左に挿入したい // auto it = lower_bound(begin(A), end(A), 3); auto it = ranges::lower_bound(A, 3); if (it != end(A)){ // int index = distance(begin(A), it); int index = it - begin(A); cout << index << " "; // 2 cout << *it << " "; // 3 } } { // (2) // 3 を挿入するとしたら、どこへ挿入するか?を返す // ただし, 同じ値があれば一番右に挿入したい // auto it = upper_bound(begin(A), end(A), 3); auto it = ranges::upper_bound(A, 3); if (it != end(A)){ // int index = distance(begin(A), it); int index = it - begin(A); cout << index << " "; // 5 cout << *it << " "; // 4 } } } ```
ポインタ、まだよくわからないのでChatGPTの解説を鵜呑みにした事を話しているので間違いかは現段階では分かりません😂コメントコードありがとうございます!拝見いたします!
とりあえず尺取り法まとめ部分を拝見。 今度は正しく理解できていると思います! (倍数は2倍の数という意味ではないことを除けば) 私の提出コードはwillowさんと同じく上の餅ベースで考えて尺取り法をしてたので、そっちを使ってくださればご自身のコードと比較しやすかったでしょうにw
尺取り法をわかりやすくするコードを作ったんだけど、何度コメントしても消される……なんでだろう? これはUA-camによる自動削除? それともwillowさんが手動で消してます? 後者ならあんまりいろいろ書くのやめときますが……。
@@DDincrementさん、消してはいないので記述が引っかかっているか、コメントの表示部分に、「人気順・新着順」があり、新着順にしないとコメントが表示しない事は自分は確認しています😓
確認しましたが新着順コメントに表示がされないので、コードの記述がコメント出来ない何かに引っ掛かっているかもしれません😫書いていただいたのにコメント受け取れず申し訳ありません😭🙇🏻♂️
再挑戦しましたが、やっぱり消されますね。 何がいけないんだろう。 とりあえず「#61645660」と提出番号だけ書いてコメントが通るか確認。
これは通ったぽい……? 尺取り法が何やってるか、理解の助けになると思いますので、コードテストで動かしてみてください。
コンテストおつかれさまでした! C問題、問題の引っ掛けや読み落としもなく、チェックできてましたね RLEに方針が流れてしまったのが残念 公式のしゃくとり法でも解けるの文言から、コード考えて見たけど... 私も「これもしゃくとり法?」ってなりました(公式とほぼ同じコードになったんでですけどねw) WillowLogさんの提出見させてもらいました C問題、ACとれてましたね! しゃくとり法で提出したコードについては、j のループを毎回 i+1 から始めるときつそう O(N^2) かな? ループの外で j=0 にして、毎回更新後の j から始めれば、それだけでいけるのでは? ```cpp int j=0; for(int i = 0; i < n-1; ++i){ for( ; j < n; ++j){ ... ``` あと、TLEの件って、もしかしてデバッグを吐き出しまくってた? 使ったことないから挙動を知らないんでわからないけどw
二分探索はACできました! エラー対策の一文を削除したら動きました😂😂😂! 尺取り法は公式解説を確認してみたのですが、使える様になるにはまだかかりそうです🫣難
willowさんの尺取法の理解がちょっと違うので、二分探索もあわせて探索法を簡単に解説しますね。 willowさんの方針に合わせて、それぞれの餅が何個の餅の上に載せられるかを数えて合計する方針で考えます。 今回、下の餅は大きすぎて困ることはないので、「この餅はOKだけど1つ手前の餅はNG」という餅を見つければ、載せられる餅の個数はすぐにわかります。 この「この餅はOKだけど1つ手前の餅はNG」という餅を、以下「ギリOK餅」と呼ぶことにします。 (1) 線形探索 0番の餅を載せられるかどうか、0番から順に試します。 最初に載せられたやつが、ギリOK餅です。 1番の餅を載せられるかどうか、0番から順に試します。 最初に載せられたやつが、ギリOK餅です。 以下、n-1番までギリOK餅を探します。 理屈の上では正しく答えが出ますが、試しに載せてみる行為の回数がとても多いです。 餅が100個なら1万回、1万個なら1億回、50万個なら250億回の試し乗せが必要です。 実行時間はO(n^2)で、間に合いません。 (2) ちょっと工夫した線形探索(willowさんが尺取法と誤解していたやつ) 自分より大きい餅以外は載せてみる必要がないので、スタート地点を工夫します。 0番の餅を載せられるかどうか、1番から順に試します。 最初に載せられたやつが、ギリOK餅です。 1番の餅を載せられるかどうか、2番から順に試します。 最初に載せられたやつが、ギリOK餅です。 以下、n-1番までギリOK餅を探します。 工夫なしよりは半分に減っていますが、TLE対策では半分ごときじゃ焼け石に水です。 餅が100個なら約5000回、1万個なら約5000万回、50万個なら約125億回の試し乗せが必要です。 これでも実行時間はO(n^2)で、間に合いません。 (3) 二分探索 ギリOK餅を探す方法を工夫しましょう。 何も、馬鹿正直に前から順番に探す必要はありません。 最初にいきなり、真ん中の餅に載せられるか試します。 載せられるならギリOK餅はそれより左に、載せられないならギリOK餅はそれより右にあることがわかります。 次に、可能性がある範囲の真ん中の餅に載せられるか試します。 載せられるならギリOK餅はそれより左に、載せられないならギリOK餅はそれより右にあることがわかります。 このように繰り返すと、線形探索よりはるかに早くギリOK餅を見つけられます。 (例えば餅が7個の場合で試すと、餅1個あたり3回で見つけられることがわかりやすいと思います) lower_bound()を使うのもいいですし、時間無制限なら何かを参考に見ながら自力で一度書いてみるのもいい勉強になります。 試し載せの回数は、餅が100個なら700回(1個あたり7回)、1万個なら13万回(1個あたり13回)、50万個なら950万回(1個あたり19回)です。 実行時間はO(n*logn)で、今回の制限なら余裕で間に合います。 (willowさんの3回目の提出が2回目よりたくさんTLEしてるのは、おそらく二分探索とは別の何かのせい) (4) 尺取法 0番の餅を載せられるかどうか、0番から順に試します。 最初に載せられたやつが、ギリOK餅です。 ここまでは線形探索と同じですが、次が尺取法のポイントです。 1番の餅を載せられるかどうか、「0番に対するギリOK餅」から順に試します。 最初に載せられたやつが、ギリOK餅です。 以下、n-1番までギリOK餅を探します。 上の餅がさっきより大きいのに、ギリOK餅がさっきより小さくなることはありません。 それを利用してjを再初期化せずに前回のゴール地点から探索を続けることで、爆速で探索できます。 (iとjがどこを見ているか、その変化をお絵描きすると、iとjの間が尺取り虫のように伸びたり縮んだりする様子がよくわかると思います) 試し載せの回数は、餅が100個なら200回、1万個なら2万回、50万個なら100万回です。 実行時間はO(n)で、今回の問題ではおそらく最速です。 二分探索の練習問題は、他の方が挙げていたのでそちらを。 尺取法の練習問題は、ABC326Cとかがいいですかね。 二分探索でも解けちゃいますが。 (というか、尺取法の問題のうち二分探索で代用できないやつは高難度なものしかないので、二分探索を先に身につけた方がいいという話も)
投稿してから思ったこと。 全然「簡単に解説」じゃねぇなコレ。
@@DDincrementさん 丁寧な解説ありがとうございます! 尺取り法勉強になります‼️ Cからは計算量の計算をやれる様にしないとですね😓
2分探索のコードがTLEとなった原因は、コードの先頭の以下の文です。 #define _GLIBCXX_DEBUG // 空のコンテナに対する操作した場合実行エラーを出す こちらを入れると実行が遅くなるので、削除することをお勧めします。 (vectorの要素アクセスにvector::at()を使うのであれば、こちらを入れる必要はありません)
😱😱😱😱C++入門で書いてあったので入れていましたが、デメリットがあったのですね‼️ 有無の速度を確認してみます!ご指摘ありがとうございます!😭🙇🏻♂️
お疲れ様です! 【C問題】abc388/submissions/61563992 lower_boundを使って解きました。 (upper_boundは1ミリも思い浮かびませんでした) 答えが見つからない場合が怖かったので、両端に番兵を置きました。 lower_boundって最初不思議ですよね。 - X.begin()をしないとイテレータが返ってくるところが。 // index、添字 int l = lower_bound(X.begin(), X.end(), left) - X.begin(); int r = upper_bound(X.begin(), X.end(), right) - X.begin(); // イテレータ auto l = lower_bound(X.begin(), X.end(), left); auto r = upper_bound(X.begin(), X.end(), right); 【類題】鉄則A11、鉄則B11、ABC231C
付け足すと添え字が返ってくる…!不思議😳 また一つ、二分探索への理解が深まります‼️ 謎なので良く調べてみます!
初4完できたー!! やったー✨️✨️✨️💕💕💕
㊗️4完おめでとうございます🎈🎊🥳! お見事━━━━(n'∀')η━━━━‼️
おつかれさまです! 2完するまでの時間もだいぶ短くなりましたね! そろそろ問題の中身次第で初の3完も期待できそう。 C問題のしゃくとり虫くんの参考コードどうぞ abc388/submissions/61568626
数学の問題が出たら苦しみそうですが、だいぶ早くなりました!💪 Cはまだまだ研鑽が足りていないのでこれから頑張ります。 コードありがとうございます、勉強させていただきます🙇🏻♂️
修正前のソースで、具体的に問題が起こるケースを追いたいなら、以下の入力例はいかがでしょうか。 3 1 . S G こんな感じで動作するのが分かるかと思います。 ・最初にqueUDに(1,0)が登録される ・queUDの先頭(1,0)を処理して、queLRに(2,0)と(0,0)が登録される(queUDは空になる) ・queUDが空なので、stateを0から1にする ・queLRの先頭(2,0)を処理するが、左右とも壁なのでqueUDに値が入らない ・queUDが空なので、stateを1から0にする ←ここが問題 ・queLRに(0,0)が登録されていて空ではないので、ループ先頭に戻る ・stateが0なので、queUDの先頭を処理しようとするが、queUDが空なのでエラーで落ちる 念のため、私が修正してACとなったソースを載せておきます。 abc387/submissions/61407187
横から失礼します。 willowさんはstateのチェックのときにもqueueが空かチェックを入れているので、最後は ・queUDが空なのでqueueの処理は何もせずstateを1にする で動作が怪しいながらも偶然正しく処理が続行されると思いますが、いかがでしょう?
おっと失礼、前回の途中段階のソースと見間違えていました。 こちらのソースの場合は、'.'のみ通過可能と判定している('G'が通過可能とみなされない)のが原因ですね。
コードありがとうございます!確認してみます! どの様なケース発生するのか、意図通り動くのかを確認する入力例を作るのは難しいですね😓バグの原因をわかった上でサンプルを作るのか、バグの原因を絞る為のサンプルを幾つかバリエーションを用意しておくのか…。 …テスト用のサンプルを考えてみると、どういう挙動がありえそえなのかを考える練習になる気がしてきました😳
D問題、ACおめでとう!しかも queue 2本を連携するとは!この発想はなかった。むずかしい! 例によって、脳筋コード書いときますw 公式解説のように、市松模様の i+j の偶奇とか、距離の偶奇で、上下|左右を指定するかわりに 最初だけ、上下|左右どちらへ移動するか指定し、以降、上下|左右を交互に指定するようにしました ```cpp // いつものおまじない追加してください int H, W; // bfs の引数手抜きのため global におく string S[1000]; int INF = 1e9; int sh, sw; // 開始位置 int gh, gw; // 終了位置 vector<vector<pair<int, int>>> dirs{ {{-1, 0}, {1, 0}}, // dirs[0]: 上下に移動 {{0, -1}, {0, 1}} // dirs[1]: 左右に移動 }; int bfs(int si) { // si: 開始位置から 上下|左右 どちらに移動するか vector dists(H, vector<int>(W, INF)); // 距離を初期設定 dists[sh][sw] = 0; // 開始位置の距離 queue<tuple<int, int, int>> que({{sh, sw, si}}); // 開始位置の情報を初期設定 while (size(que)) { // 終了位置に未達の場合, que が空になり抜ける. 未達 -> 終了位置の距離 INF // h,w: 移動元の位置 // i: dirs を選択し, 移動元から 上下|左右 どちらに移動か決めるため // 距離が +1 する毎に 0|1 (上下|左右) が入れ替わるようにする auto [h, w, i] = que.front(); // 移動元の情報取得 que.pop(); // 移動元の情報削除 if (S[h][w] == 'G') break; // 終了位置で抜ける int next_dist = dists[h][w] + 1; // 移動先までの距離 int ni = 1 - i; // i=0 -> ni=1, i=1 -> ni=0, 移動先から 上下|左右 どちらに移動か for (auto [dh, dw] : dirs[i]) { // dirs[0]: 上下, dirs[1]: 左右 int nh = h + dh, nw = w + dw; // nh,nw: 次の位置 if (!(0 <= nh && nh < H && 0 <= nw && nw < W)) continue; // 範囲外 if (S[nh][nw] == '#') continue; // 障害物 if (dists[nh][nw] <= next_dist) continue; // すでに next_dist 以下で訪問可能 -> 再訪問不要 dists[nh][nw] = next_dist; // 移動先 までの距離を記録 que.emplace(nh, nw, ni); // 移動先の情報を追加 } } return dists[gh][gw]; // 終了位置までの距離を返す } int main() { cin >> H >> W; for (int i = 0; i < H; i++) cin >> S[i]; for (int h = 0; h < H; h++) // 開始位置 (sh,sw), 終了位置 (gh,gw) を取得 for (int w = 0; w < W; w++) { if (S[h][w] == 'S') sh = h, sw = w; if (S[h][w] == 'G') gh = h, gw = w; } int dist = min(bfs(0), bfs(1)); // bfs(0): 開始位置から上下に移動, bfs(1): 開始位置から左右に移動 cout << (dist != INF ? dist : -1) << endl; } ```
いざという時、解決バリエーションが身を救う💪✨ コードありがとうございます!動かしながら確認してみます!
おお、ACおめでとうございます! queue2つを交互に使う難しい方で完走するとは。 これができるなら、次にグリッドで「最短距離を求めなさい」が来たら本番中のACも狙えそうですね! あとは「ゴールできるかどうか」もいけるかな?(これはBFSでもDFSでもどっちでもいい) 一応、当日挑戦でのコードで、「この辺あやしいぞ?」って思った箇所を2点挙げておきます。 1つめ、未探索マスかどうかのチェックにkashikaの中身を調べているように見えます。 で、このkashikaをきちんと管理できていれば多分問題ないんですが、ここについでに距離を数字として表示しようとしていたのが悪さをしているように見えます。 というのは、距離が10以上だと、文字数が増えるせいで迷路の壁が全部ずれると思うんですよね。 最後に走らせたときに、10を超えて初めて右移動しようとしたところでバグっていたのは、これが原因じゃないかと思います。 というか、そもそも、探索済かどうかは距離が1e9かどうかを見ることで話が済んでいるので、kashikaをチェックすることに意味はありません……。 2つめ、モード切り替えのif文の中身が怪しそうに見えます。 横方向のqueueが空になっていたら、というif文を縦モードのときもチェックしてませんかね? これにより、 横queueが空になったので縦モードになりました! →縦モードのqueueの先頭は上下とも調査不要でした!横queueには何も追加しません! →横queueが空なのでモード切り替えをします! →縦queueの中身が残ってるのに横モード開始 という動作をするように見えます。 横queueが空なので、何もせずにまた縦モードに戻って表面的にはバグらなさそうな気もしますが、本当にそうなのかは自信はありません。 何にせよ、このモード切り替えみたいなことをするときは、以下の2つをした方がいいのかなと思います。 今回なら、少なくともどっちかがやってあれば何も問題はなくなるはずです(もちろん両方やるのが最も安全)。 if(今0番モードかどうか&&0番モードから1番モードに切り替える条件) のように、現在のモードと切り替え条件の両方を確認する。 モード変更を、bit反転ではなく「0番にする」「1番にする」と明示的に書く。
「 . 」と「 G 」を、範囲チェックのif文に入れようとして、分けたif文にする発想が無かったためにKashimaのデータを使って無理やりGのチェックを入れようとしたのは、改めて見ると👀混ぜるな危険でした😇 条件の動作を、また確認してみます!
通過可能マスにいろいろ種類があって大変……だと思うじゃないですか。 実は「壁と違う」を判定すれば一発です。
あけましておめでとうございます C問題をサクッとパスして、D問題にかかったのは懸命だったね! 私は、C問題に執着して、結局解けなかったよw コンテスト後に、D問題みたら、方針すぐに決まって、ちょっと時間かかったけど解けたよ。もったいない! 解けない問題に執着するクセ直さないとねw
あけましておめでとうございます🎍! C頑張るか迷いました😂でもqueueを使ってみるのに紹介していただいた動画がD問題でしたので、問題によってはACはできなくても考えることを楽しめるかもしれないと考えることができました! それがなかったらD問題のページをはなから無理と開かなかったと思います😅 あと、グリッド問題だったのがD問題に取り組んでみた1番の決め手でした🫣好奇心
あけましておめでとうございます。
あけましておめでとうございます!🎍 ゆるりと楽しく学びながらよろしくお願いします💪☺️
This time, the level for C was way higher than B (id say it was higher than D was well). To solve C you either need to be familiar with math (combinatorics) or used to Dynamic Programming (Digit DP to be precise) problems to solve it. DP is a fairly complicated topic so i was surprised seeing it used in problem C. For D, graph traversal algorithms for shortest distance (BFS, Dijkstras) can help, but you also need to remember the last direction in which you moved (left / right or up / down), so the next step can be in the opposite axis. Good luck with the practice!
This time, problem C was full of concepts I’ve never seen before! I think it’s a great opportunity to learn more in the future, so I see it as a chance to challenge myself! Math, in particular, might take me some time, but I’ll work on it step by step. (´・ω・`) As for problem D, I’ll take a short break and try it again on Monday. I’ve only heard of Dijkstra’s algorithm by name, but I haven’t learned it yet. When I study it, I’m looking forward to comparing it with BFS through this problem! Happy New Year! I’ll do my best while enjoying the process this year as well!
新年初のABCは2025とヘビの問題が多かったですね。D問題はできたけどC問題ができず・・・それでも過去最高のパフォーマンス1129(レーティングは632)を叩き出すことができました。茶色コーダーの自分語り失礼しました。
2025年、良い幕開けになったのですね!あけましておめでとうございます!🎍 干支も取り入れた新たな年を感じる問題に☺️笑顔になりました!
お疲れ様です!たぶんD問題の8合目ぐらいまで来てると思います。movesのあたりは、上下移動か左右移動を表現していると思います。
8合目!ゴールまでもう一息💪 コードの理解が深まりそうです! 💪あけましておめでとうございます🎍
@@WillowLog あけましておめでとうございます! C問題をそこそこに切り上げてD問題に移行した判断は見事だと思いました。 D問題の解説を参考に一応ACできたのでご参考まで。 abc387/submissions/61411294 ですが、イマイチなぜこのコードで正解できるのか分かってません。 dist[ni][nj] == infで距離更新するのは分かるのですが、infになっていない箇所を更新しないのが不思議に思ってます。 問題の性質上、同じマスを二度通るのは最適ではないので、二度通る必要がないのは分かるのですが。 ni, nj ・・・next_i, next_jの意味を込めてる dist・・・distanceの略 dir・・・directionの略
横から割り込みで解説失礼します。 BFSのポイントはqueueで先入れ先出しを保証していることです。 これにより、 距離0のところを全部調べる→距離1のところを全部調べる→距離2のところを全部調べる→…… という調査順になることが保証されます。 すなわち、初めてqueueにその地点が登場したときが、絶対にそのマスへの最短経路であることが保証されているのです。 言い換えれば、距離がINFじゃない場合はこの地点の登場が2回目以降、つまり最短経路をすでに調査済みの地点なので重ねて調べる必要がないからパス、ということです。 そういうことなので、willowさんみたいにqueueを2つに分けたりすると、全体での先入れ先出しの保証がなくなってBFSに失敗することになるんですね。
@@DDincrement ありがございます。理解が深まりました!
@DDincrement さん Oh!queueを二つ用意すると、全体のBFSに失敗する…勉強になります🥹ありがとうございます🙇🏻♂️🙇🏻♂️🙇🏻♂️
そうそう、DFSをやりたいなら、グリッドじゃないですがABC213Dが典型問題ですのでぜひ。 ただ、先にグラフ理論の基礎的なことをやらないと厳しいかも……?
ABC213D解いてなかったので解いてみます!
問題の紹介、ありがとうございます! グラフ理論の勉強をかねて取り組んでみます💪
あけましておめでとうございます! C問題、難しかったですねえ。 willowさんのランクだと、ABの早解き勝負になってたでしょうね。 こっちも、AB合わせて3分、Dに5分、Cに85分かかりました、危なかった……。 D問題見た瞬間、「willowさんがC飛ばしてDやることに気づけばワンチャン!?」と思ったのですが、流石に難しかったですか。 ちょっとグリッドBFSのコード内に手を入れないといけないので、 ・グリッドBFSの仕組みをしっかり理解している ・問題に合わせた実装変更をできる力がある の両方必要で厳しかったですかね。 多分willowさんにとって一番簡単なのは、以下かなと思いますので、再挑戦でぜひ。 ・queueに次を追加するときに、現地点のスタートからの距離が偶数なら横移動のみ、奇数なら縦移動のみを追加するパターンをやる ・偶数奇数逆にしたパターンもやる 関数に0か1を渡せるようにして、「距離+渡された値」の偶奇で挙動を切り替えるようにすると実装しやすいかなと思います。 別解: 迷路を2回建てにして、1階からは横の隣マスの2階に行ける、2階からは縦の隣マスの1階に行ける、というルールでスタート2ヶ所(1階と2階)の3次元グリッドBFSをする。 手元に持ってたBFSのコード次第ではこっちで一瞬。
あけましておめでとうございます⛩🎍 C問題を飛ばしてD問題はグリッド問題でしたので、解きに行く判断して良かったです😂Cはサッパリ D問題は手法は合っていたみたいですが、工夫と時間がまだまだですね!⏰再チャレンジしてみます💪
良いお年を✨
よいお年を!からのあけましておめでとうございます!
応援しています。
ありがとうございます!がんばります!
今回、A問題もB問題もややこしかった! B問題、正規表現って処理で文字列を置換する方法もあるよ! 正規表現の変換ルールの書き方が、これまたおまじない感半端ないので 全然覚えてないけど、単純な置き換えなら以下の通りでOK! これを、コンテスト中に浮かばないのが我ながら残念w ```cpp int main() { string S; cin >> S; // 正規表現で文字列全体に置換処理をおこなう "00"->"w" string T = regex_replace(S, regex("00"), "w"); cout << "S:"<< S << " "; cout << "T:"<< T << " "; // 置換の結果を確認して cout << size(T) << endl; // 解 } ```
正規表現!使ったことはないですが聞いたことはあります🤔 独特な記法も覚えられたら便利そうですね!
あれ、衣装戻ったんだ
クリスマス衣装でしたので☺️
2完おめでとうございまーす!🎉 A問題もB問題も細かい罠がある問題でしたが、無事突破しているのはすごい! こちら今回5完で、初めての青パフォ、初めての3桁順位達成でした。 willowさんの頑張りに触発されたおかげがとても大きいです。 これからもお互い頑張っていきましょうね!
入門を進めながら、安定して2完を取れる様に頑張ります😊 青!😳 とても素晴らしいパフォーマンスで2025年を迎えるのですね!おめでとうございます!🎉 そして、こちらこそたくさんのアドバイスやコメントをいただき、次への頑張りに繋がっています。本当に感謝しています!
私がコンテスト本番で使った解法、置いときますね。 多分こっちの方が簡単です。 queueの出番はないですが……。 最初に植物を植えるときは、高さ0に植えます。 植木鉢の高さを適当なvectorに追加していきます。 時間が経過するときには、植物のてっぺんの高さの変化を別の整数に計算しておきます。 で、追加で種を植えるとき、高さ0じゃなく、今植物のてっぺんがある高さに植木鉢を用意します。 植木鉢の高さを適当なvectorに追加していきます。 こうすると、全植物のてっぺんの高さが自動的に統一されます。 植物の長さは「てっぺんの高さ-各植木鉢の高さ」で計算できるので、日付の経過が1変数の更新で済みます。 刈り取るときは、植物の長さの条件を植木鉢の高さの条件に書き直します。 植木鉢の高さのvectorは自動的にソートされているので、二分探索でも前から順に確認でもなんでもいいので、どこまで刈るべきかはすぐ計算できます。
提出番号貼り忘れた……。 abc379/submissions/59604874です。 コンテスト中に急いで書いたやつなので、スペースとか入れてなくてやや読みにくいかもしれませんが。
長時間の勉強お疲れ様です。解けない問題でも向き合い続けられるのすごい。 この問題、実はいくつかのポイントを押さえるとキューを用いさえすれば、難しいアルゴリズム無しに解くことができます。 ポイントは •クエリが進むほど時間はどんどん先に進んでいる(戻ることはない) •新しく植える植物は全部高さが0 •現在時刻と、植えた時刻さえあれば植物の高さが計算できる この3点に着目するのが大事です。 時間が進み続け、常に高さ0で植えるのだから、後の方にくるクエリ1で植える植物の方が背が低くなるはずです。 なので、キューに植物を植えて、その先頭をみた時、先頭が収穫できないならそれ以降も収穫できません(残っている植物のうち先頭がいちばん大きいから) これで3の収穫クエリについて全要素見る必要はなくなりました。先頭が収穫できないなら探索を止めていいわけです。 とはいえ、日が進んだときに毎回キューの中身に全部Tを足していると、植物が大量にある場合 (植物の数)×(日数経過クエリの数)の計算回数がいります。 植物を植えまくってから、日数経過だけを何回も繰り返されると時間がものすごいかかってしまいます。 TLEとなるテストケースはこれですね。 ここで、「植物の高さって実は管理しなくてもいいんじゃない?」と気付けるかが大事になります。 実は「現在の日付」と「植えた日付」さえあれば高さは逆算できるのです。 例として、現在4日目で1日目に植物を植えたとします。今の高さは(4 - 1) = 3になりますね。 このように高さの情報がなくても「現在の日付」と「植えた日付」さえわかれば計算で求められるのです。 現在の日付は日数経過クエリを足しあわせればわかります。 現在の日付さえ管理しておけば、キューの中には高さが入っていなくても「植えた日付」さえ入っていればキューに入っている植物の高さは求められます。 こうすると、1番のクエリは「日付をキューに入れる」、2番のクエリは「現在の日付にTを足す」だけになります。 あとは3番のクエリですが、入れるものが高さから現在時刻に変わっても上で触れた通り「先のクエリで入った植物の方が大きい」ので先頭が収穫できるかをwhile文などで繰り返せばよいです。配列でなくキューを使うことで、収穫したらもうその植物について調べなくてよくなりますね。 「全部の高さを操作すると時間が足りないからなにか工夫できないか?」 「先に入った方が背が高いなら先頭を見ればよくて、収穫済みなら取り出していいんだからキューを使うと楽になる」という発想に至るのがポイントな問題でした
おぉ!今、気がついた! 今日、ようつべのアカをブラアカに変更して、なんかコメ消えてる?ってなってる。 登録したチャンネルとか大丈夫みたいなんだけどね あ、見るアカなんでなんもないですw D問題、キューだけでなく、今の時間は?って情報を持って、 植えたとき、今の時間をキューに突っ込んで 収穫のとき、キューの先頭から見ていって、今の時間ー植えた時間=その植木の高さなので その植木の高さが H 以上だったら、キューからひっこ抜いて、収穫する感じかな? 流石に時間的に、試してないから、できるかどうかしらんけどW
お疲れ様です! ABC後にゆっくり見てください。 【ABC379 D問題】abc379/submissions/61140026 問題文通りに、経過日数に応じてそれぞれの植木鉢の植物の高さを増加させたくなります。 ですがそのままシミュレーションすると、見事にTLEします。 そこで、queueに入れるデータを植物の高さではなくて、植えた日を格納することにします。 高さチェックの際は、今日の日付と植えた日の日数差を計算することで、その植物の高さが計算できます! 【キューは使わないけどおすすめ問題】ABC239 C問題 連想配列(mapのこと) 必須 連長圧縮 あると便利。abc259/submissions/61140548。abc329/submissions/61140583。 尺取法 強力な技だけど、難しいので今は後回し。二分探索がある程度わかってからのほうが理解しやすいので、二分探索とか累積和について理解を深めることを優先したい。 グラフは、簡単な教育的問題がごくまれにB問題で出題されているので、それは取り組んでもいいかも。 ダブリング 不要。