itiB / atCoder

atCoderを解いていく

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

atCoder

commit message

  • add: <コンテスト名> (AC: <問題名>)
    • コンテストが終わった時点でのコミット
  • <コンテスト名>
    • README.mdを追加したときのコミット
  • Refact: <問題名>
    • Refact
  • AC: <問題名>
    • コンテスト後にACしたものを書く

LESSON

atc

atc001

  • B - Union Find
    • UnionFindを用いて入力された値をグループに分ける

arc

arc005

  • C - 器物損壊!高橋君
    • アルゴリズムとデータ構造本章末問題14.4
    • マス目を移動していく問題をグラフと考えてBFSで解いていく問題
    • BFSで行く先をキューに追加する際にその行先は存在するかを確認しながら進んでいく

arc008

  • B - 謎のたこ焼きおじさん
    • 文字列を作るためのKitが渡されるので何個のKitを使えば文字列が作れるか数える問題
    • Kitの文字列とNameの文字列Mapを作って調べればいい

arc015

arc030

  • A - 閉路グラフ
    • グラフの連結成分とはなにかわかっていなかった
    • 頂点を減らしていって指定した連結成分の数にする

arc038

  • C - 億マス計算
    • a*b の値の中でN番目に小さい値を探すもの
    • つまりN-1個が決め打ちした値以下存在するものを2分探索する問題
    • 決めうちする値とループさせたa, limit以下になるbを2分探索する2重の2分探索が必要

arc047

  • C - 一次元リバーシ
    • リバーシを単一色にするには何手でできるかを求める問題
    • まとまりの個数を数えて - 1 するだけ、発想の問題

arc058

  • C - 怪文書
    • 文字列の辞書(HashMap)を作成してそれぞれいくつあるかを調べていく
    • それぞれの文字が含まれる最小の値を取っていけばすべての文字列に含まれる最大の文字数を調べられる。

arc059

  • C - いっしょ
    • すべての値について総当たりで差の合計が最小になるものを探す
    • vec -> .iter().fold() 使ってみている

arc068

  • C - X: Yet Another Die Game
    • さいころを回して目標の数を超えるのがいつかを調べる問題
    • 計算で求められる
    • HashMapの長さやそのなかのキーがそれぞれいくつ含まれてるかとか求めたりとかした
    • また特定の値が含まれたりとかしらべたしHashMapで困ったらみるべき

arc073

  • C - Sentou
    • 銭湯のお湯が出るボタンを押していく人たちがいて合計いくらの時間お湯がでるか調べる
    • 人が来るのがはやいか止まるのがはやいかでminをとって合計する
    • 最後の分を1回たす

arc092

  • C - 2D Plane 2N Points
    • 青X軸、y軸ともに小さいペアの個数を数える問題
    • 貪欲法を用いて青のX軸が一番大きいものに対して対応することができる赤色のうちY軸が最も大きいものを選んでいくを繰り返す
    • タプルのソートを作ることができた! tuple.sort_by_key(|item| item.1);

arc093

  • C - Traveling Plan
    • 旅行する系問題
    • 目的地として行かなくなる場所ができた場合にいくらのコストがかかるようになるかを調べる問題
    • 全体のコストと置き換わるコストを調べて入れ替えればOK

arc095

  • C - Many Medians
    • **値が特定の数字を除いた場合にどれになるかをすべて列挙する問題
    • 除く数字が既存の**値よりも大きいか小さいかをもとめてどちらに**値が転がるかで判定する

arc098

  • C - Attention
    • 人々が向いている方向を統一する
    • 数列の左半分で目標と違う方向を向いてる人数、右半分で向いていない人数を調べるために累積和を用いることができる形にする

arc100

  • C - Linear Approximation
    • Σ(A_i - b) が最小となるbはA_iのメジアンであることを知っているか否か

arc105

  • A - Fourtune Cookies
    • すべての組み合わせを列挙して総当たりで試した、美しくない...
  • B - MAX-=min
    • 一番大きいカードから一番小さいカードを引くことを繰り返す
    • 最終的に出来上がる値はすべての数の最大公約数であるから最大公約数を求めて解ける

arc106

  • A - 106
    • 3^A + 5^b = N のとき、ABを求める問題
    • 3の累乗の値か調べたりとか作った
    • N - 5^bにして出てきた値が3 ^ Aで表せるなら解
  • B - Values
    • 値をひっくり返す系は総和がかわらないことを生かす
    • 差をとってグループ分けし、それが0ならOKにする
    • UnionFindを用いた

arc109

  • A - Hands
    • 100階建ての建物があってiとi階, iとi+1階がつながっているときにb棟のn階に行く最短経路を求める
    • A棟だけで移動したとき、A棟からB棟へ移動するだけの時、B棟からA棟に移動することがあるときの3パターンでDPを作って求めた
  • B - log
    • 丸太を切る系問題
    • n+1mまでの丸太があるので1~nまでの丸太をいくらで買えるかを調べる
    • つまりは n+1 の丸太をいくつに割れるか問題
    • ひたすら下から切っていけば logN で求めることができる
    • 2分探索してもいいらしい

arc110

arc117

  • B - ARC Wrecker
    • 大砲を撃ってビルの高さを減らしていく問題
    • 同じになるところを区切りに組み合わせを掛け算していけばいい
    • 突き出たところがあるならそこが平らになるまでの回数、
    • 同じになったら下につくまで何回あるかを掛け算する

arc118

  • B -
    • 分数でMaxを求めよって言われているなら全部に共通の数字かけていいよね
    • 絶対値とるのは面倒だから両方のパターンで大きいほうで撮ればいいよね ...

arc119

  • A - 119 × 2^23 + 1
    • この式の形を見たら ⌊n / 2^23⌋!! ってならないといけない
    • あとは2 ^ 60 で 10^16 を越えることに気が付けばOK

arc121

  • A - 2nd Greatest Distance
    • 総当たりするとTLEする
    • 座標をもとに距離のとおい2つの家の組み合わせのうち2つめに遠いものを選ぶ問題
    • 答えになりうる家をメモしておく(x, yの最大最小2つまでで高々2つ)
    • ベクタの中身の範囲を指定して切り取るdrainを使ってみた
    • あとベクタの逆順ソート、キー指定ソート

arc123

  • A - Arithmetic Sequence
    • 3つの数が与えられるので等差数列を作る問題
    • 3つのうちどれを変化させるかで式を作る。
    • 小数点が発生してしまう場合は隣を1つ加えれば何とかなる
  • B - Increasing Triples
    • 3つの数列が与えられるのでi番目がA_i < B_i < C_iになるようにする
    • ソートして全探索した

agc

agc006

  • A - Prefix and Suffix
    • 二つの文字列の後半と前半を重ね合わせてどれだけ短い文字列をつくることができるか
    • 一番多く重なるとき(合わせた文字が短くなるとき)からn文字目までが重なるかを調べて行けばいい

agc007

  • A - Shik and Stone
    • 駒が動いた軌跡を与えられるのでその駒は右下のみの移動をして右下までたどり着いたかを調べる
    • 駒が動いた軌跡だから軌跡の個数を調べれば良かったらしい
    • そこまで頭が回らずループで右、下に移動したかを記録しながら調べた

agc009

  • A - Multiple Array
    • ボタンを何回か押してすべての数を別で与えられた数列の倍数にする問題
    • 後ろから順番に貪欲法で足していく

agc015

  • B - Evilator
    • 上にしかいけない階と下にしかいけない階のあるエレベータ
    • すべての階にそれぞれ行くには合計何回かかるか調べる問題
    • 遠くても2回でいけるからただ足すだけ

agc017

  • A - Biscuits
    • 偶数と奇数の袋がそれぞれいくつあるか数える
    • 奇数の袋を奇数個(nC2k+1)または偶数個(nC1k)選ぶ組み合せがいくつあるか調べる関数
    • 合計が偶数になるには (偶数の袋をいくつでも選ぶ組 x 奇数の袋を偶数選ぶ組)
    • 合計が奇数になるには (偶数の袋をいくつでも選ぶ組 x 奇数の袋を奇数選ぶ組)

agc019

  • A - Ice Tea Store
    • 0.25, 0.5, 1, 2lの値段が渡されるのでちょうどNlを買うためにはいくら必要かを求める
    • 2Lを買うのに最小の値段 + 1Lを買うのに最小の値段でNLを達成すればOK

agc028

  • A - Two Abbreviations
    • range.all()でif文を各サンプルがおいてある
    • 最大公約数と最小公倍数をもちいて特定の法則で縮めた文字列が一致するかを求める問題

agc034

  • A - Kenken Race
    • 飛び越えて目的地にたどり着けるかを調べる
    • みぎにしか移動できない制約に気づいていなかったのでめちゃWA
    • 調べる範囲をうまく指定できなくてめちゃWA
    • 泣いた

agc035

  • A - XOR Circle
    • XORの性質を用いたもの
    • 円形上のラクダに帽子をかぶせられるか

agc039

  • A - Connection and Disconnection
    • 文字列を指定された回数つなげて同じ文字が連続した際には消す
    • いくつ消したかを数え上げる問題
    • 消されるパターンで場合分けを行う
      • そのままつなげ続けられるパターン
      • 2個目以降はそのまま繋がるパターン
      • 2個セットで繋がっていくパターン

agc048

  • A - atcoder < S
    • Stringの中に指定した文字が含まれるか探索
    • はじめがaでそのつぎがそれ以外なら....を考えて説く問題

agc054

  • A - Remove Substrings
    • 与えられた文字列のうち、最初と最後が異なる部分文字列を消すことができる
    • 全部消すことができるか判定する問題
    • 最大でも2回で全部消せることを生かして場合分けを行う

abc

abc006

  • B - トリボナッチ数列
    • 3つ前までの数字を足して数列を作っていく問題
    • 配列用意して作ってあげればよい

abc061

  • D - Score Attack
    • 重み付き有効グラフの中で0~nまでの経路のうち最大ポイント稼げるのはどこか調べる
    • ベルマン・フォード法を用いることで最長路を求めることができる
    • 負閉路がある場合、それがnに到達する路に含まれるかを調べる必要がある

abc023

  • D - 射撃王
    • 順番に風船を撃ち落としていく問題
    • 目標タイムを決めて二分探索する

abc026

  • D - 高橋君ボール1号
    • 2分探索を各問題
    • sinの入った式が与えられてその答えが100になるところを見つける
    • これは式が連続なことを生かすと2分探索で常に正に増えたりするわけでないけど特定の範囲内に必ず答えがあるから2分探索できる
    • 複数答えが考えられる問題

abc029

  • [C - Brute-force Attack}(/abc/abc029/c.rs)
    • a~cのみを用いてできるn文字の文字列を列挙する問題
    • 再帰関数でうまく文字列をつなげていけばできる

abc040

  • C - 柱柱柱柱柱
    • 一般的なDP
    • 1つ前の柱か2つ前の柱かを選んでジャンプする

abc045

  • B - 3人でカードゲームイージー / Card Game for Three (ABC Edit)
    • 順番にターンを回していってだれが一番先に手札をなくすか調べる
    • 問題の通りに作るだけ
  • C - たくさんの数式
    • 数列を与えられるのでそれらの間に + を好きなようにはさんでできる値の合計値を調べる問題
    • ビット列を作って全探索する問題
    • 挟まるところを探索、挟まった場合には10を累乗する値を0に戻して足していく
    • ビット探索以外にもサブセットを作ってどんどんpush, popで解く方法もある

abc048

  • B - Between a and b ...
    • aからbの範囲でxで割り切れる個数を数える
    • 終わりのbから0までの間で割り切れる個数 - 始めのaから0までの間で割り切れる個数 + はじめを含むか含まないか

abc051

  • A - Haiku
    • 文字列の指定した文字を置換する .replace("a", "b")->aをbに置換できる
  • B - Sum of Three Integers
    • 3変数の合計値が指定値となるものを数え上げる
    • 3重ループだとTLEするため2重ループまでの情報から3変数目の値を逆算しなりたつかを調べる
  • C - Back and Forth
    • 最短経路を4つ、かぶらないように作る問題
    • スタート地点とゴールが1対1対応することをもちいて解いた

abc054

  • B - Template Matching
    • 入力された画素列のなかに別の入力された画素列が含まれているか調べる問題
    • 2重ループをbreakで抜けたりしつつ総当たりで調べた

abc057

  • C - Digits in Multiplication
    • ひたすらNを作るA x Bを求めていく問題
    • A x A までしか存在しえないので n < 10^10でも大丈夫
    • それぞれAとBの桁数を数えて大きいほうを現在のAnsと比較して小さいほうをAnsに入れる

abc065

  • C - Reconciled?
    • 犬とサルを整列させるパターンを数え上げる問題
    • 階乗計算はすぐにオーバーフローするので逐一modをとる必要がある
    • 並び方のパターンを調べ、それぞれについて並び変えた際の式を立てる

abc075

  • C - Bridge
    • UnionFind問題
    • UnionFindしてどれかの辺を挿入しなかった場合に辺のサイズが変わるものを探す

abc076

  • C - Dubious Document 2
    • 文字列 穴埋め
    • 文字列と??で埋められた文字列に対してキーとなる文字列が入りうるかを求める問題
    • 入るなかで辞書順で一番小さいものを出力するのでうしろから入るところを探せばOK

abc077

  • C - Snuke Festival
    • 2文探索を用いて指定した値を超えてしまう場所を探す
    • いくつ越えないものがあるかを調べてansに足していく

abc081

  • B - Shift only
    • 数列すべてが2で割り切れるときに割る
    • 各値が何回2で割り切れるかを求める
    • 一番割り切れる量が少ないものを出力する

abc082

  • C - Good Sequence
    • 文字の出現する数を数えてHashMapに入れる
    • 現れる回数とキーを比較して計算するだけ

abc087

  • C - Candies
    • 飴を集められる最大のパターンを求める問題
    • 何度目で下に移動するかを決めて選ぶ解き方とそれぞれの場所に最大でいくつの飴をもった状態で行けるかを記録していく2つのパターンが存在する

abc093

abc094

  • C - Many Medians
    • ひたすら**値を繰り返し求める問題
    • 入力されたベクタとともにソートされたベクタを作り、 指定した値を抜いた場合にはソートされたベクタの何番目が**値となるかを計算することで解くことができる

abc099

  • C - Strange Bank
    • 典型的なDPコイン問題。
    • 与えられた数までのDP列を作って回す。

abc103

  • C - Modulo Summation
    • あまりの最大値を求める問題
    • わかれば超簡単、割る数-1を合計するだけ

abc114

  • C - 755
    • 7, 5, 3だけでできる数字がいくつあるかを調べる
    • 数字からcharのHashSetに変換,ぜんぶが含まれているか調べる
    • 再帰を用いてLimitを超えていないか,すべての753が含まれているかを調べてあれば +1 で再帰を返す....を繰り返す

abc120

  • C - Unification
    • スタックを用いて同じキューブが隣り合った際に消す
    • 複雑なことはどうやらいらないらしい、証明でできるみたい

abc121

  • C - Energy Drink Collector
    • 与えられたジュースの値段でソートして買えるだけ買ってほしい本数までそろえて次の店へいく
    • エナドリを買う問題

abc122

  • C - GeT AC

    • 範囲内に含まれる AC の文字列を数える問題
    • 全部数えてたらTLEになるくらいの範囲になりうる
      • それまでにいくつ AC の文字列が含まれていたかを数えておいたmapを作成する
      • 終点 - 始点 で範囲内に含まれる数がわかってループさせなくて済む
  • D - Flipping Signs

    • Flipすると2ずつ数字が変わるため+, -のそれぞれ合計数の偶数奇数は変わらない
    • 奇数が偶数個なら奇数を0個(偶数個)にできる
    • 奇数個なら一番小さいものを-にすればいい

abc123

  • C - Five Transportations
    • 人を橋渡ししていく問題
    • どこがボトルネックになって一番時間がかかるかをしらべて最後にそれで計算すればいい

abc126

  • C - Dice and Coin
    • 最初にダイスを振ってあとコインを投げ続けてゲームに勝つ確率を求める問題
    • それぞれのダイスの目に対して確率を計算して足していけばいい

abc129

  • C - Typical Stairs
    • 穴の空いた階段を踏まないように階段を上るパターンの総数を求める問題
    • 穴が開いていなかったらフィボナッチ数列でもとまることを生かして 空いていたら値を0にすればO(N)で解ける

abc131

  • C - Anti-Division
    • a-bの範囲でc,dで割り切れない値の個数を調べる
    • b - b/c - b/d + b/lcm(c,d) - aの分とすればできる
    • 割り切れない値を列挙するために最小公倍数を足さなきゃいけないことに気づくのに時間かかった
  • D - Megalomania
    • タプルを指定した要素でソートする
    • 期限までにすべての仕事が終わらせられるかを出力する

abc132

  • E - Hopscotch Addict
    • アルゴリズムとデータ構造本章末問題14.3
    • けんけんぱで移動するグラフ
    • ちょうどパでいける地点かを判別し、何回目のぱでいけるかを出力する
    • けんけんぱをもちいてグラフを拡張、頂点とけんけんぱのどの位置かを表す(n * 3)
    • グラフが拡張できたらあとは到達できるかBFSを用いて最短距離を調べる

abc133

  • C - Remainder Minimization 2019
    • L~Rの範囲でi*jを2019でmodした最小値を求める問題
    • 1ずつ増やしていけるのでどうやっても2019*2019以内に答えが0になることを生かしてbreakを設定する

abc136

  • D - Gathering Children
    • 無限に近い回数動かすと場所が集約するR, Lのパネルを用いた問題
    • Rのパネルの値がすべてRに、Lのパネルの値がすべてLに移動する
    • このときRから偶数個めの値は偶数回動かした時にRの位置、
    • Lから偶数個目の値が偶数回動かしたときにLの位置にいることを用いて答えを求める

abc144

  • B - 81
    • Nを 1~9 の a, b の積で表せるかを調べる問題
    • forで回して総当たりすればOK
  • C - Walk on Multiplication Table
    • a * b = n となる a + b - 2 のうち最小のものを求める問題
    • n ^ 12 なので aを a*a < nの範囲において b = n/aで求めることによって O(n^6)で探索できる

abc146

  • A - Can't Wait for Holiday
    • 日曜日まであと何日かを求める
    • 配列に曜日の一覧を入れちゃえばインデックスを出力するだけ
  • B - ROT N
    • 文字列があたえられるのでRODを求めるやつ
    • u8 にして65たしたり26でmodとったりたりする
  • C - Buy an Integer
    • 2分探索を作る問題
    • 条件に当てはまる値を2文探索で探す
    • 数値の桁数を調べる関数

abc148

  • E - Double Factorial
    • それまでの数字をどんどんかけて0がいくつつくかを調べる問題
    • 10 を作るには5 x 2 が必要なことを生かして5x2で割れる数、5x5x2で割れる数...をどんどん足していくと解ける

abc149

abc150

  • A - 500 Yen Coins
    • K枚500円玉を持っているときの総額がx円以上か調べる
  • B - Count ABC
    • 文字列の中に'ABC' の文字列がいくつ含まれているか調べる
  • C - Count Order
    • 数列を入れ替えて特定の数列になった大きさを調べる
    • Permutation の使い方 Itertools を使えるようにすると使える

abc152

  • C - Low Elements
    • これまでにでてきた数字の最小の値をメモしておいてそれより小さかったら+=1して更新

abc153

  • C - Fennec vs Monster
    • フェネックが使える必殺技の回数が決まっており、それでつよい敵たちを倒す
    • のこりの敵を倒すために必要な攻撃回数を数える
  • D - Caracal vs Monster
    • 攻撃するとHPが半分に分裂していく敵を倒すゲーム
    • 再帰的に半分にしていって何体の敵がいるかに合わせてたす数を変えていけばいい

abc155

  • A - Poor
    • 仲間外れの数字があればかわいそうな組として表示
  • B - Papers, Please
    • かつ、またはの否定を求める問題
    • 偶数で3か5で割り切れない数字があったらFalse
  • C - Poll
    • 文字列がたくさん与えられるので一番多く出てきた文字列を辞書順ですべて表示する問題
    • HashMapに突っ込んでいって一番多く出現したものをベクタに突っ込む、ソートして出力

abc156

  • B - Digits
    • 進数変換したら何桁になるかを求める
    • 進数変換はひたすら割り算するだけ!
  • C - Rally
    • 総当たりで住民の減る体力が一番小さいものをみつけるだけ

abc157

  • B - Bingo
    • ビンゴに答える問題
    • マスに書かれた数字、言われた番号から穴の空いたとこマップを作成
    • 縦、横をループさせ斜めをみて列ができるか調べる
  • C - Guess The Number
    • 何桁目が何という情報が与えられるのでその数字ができるか、最も小さいものを求める
    • 条件
      • 1桁目が0じゃないこと
      • 数字が上書きされないこと
      • 全体が1桁の時は0が最小なこと

abc158

  • B - Count Balls
    • ボールを並べていくつ指定したボールがあるか
    • パターンが何回現れるかを数えて計算するタイプ、
    • 漏れた分は小さいものをえらんで
  • D - String Formation
    • 文字列を入れ替えたりするのは大変なのでどちらが先頭化を記憶しておく
    • また前後に挿入する場合はVec_dequeをつかうようにしましょうという
    • あとそれをpirntするときはループで回すと遅いので queue.iter().rev().collect::<String>() がおすすめ
  • C - Tax Increase
    • 消費税計算の問題
    • 8%のときと10%のときの消費税からもとの値段を予想する

abc159

  • A - The Number of Even Pairs
    • 偶数奇数の足し算
  • B - String Palindrome
    • 回文の探索
    • 文字列長を図る
  • C - Maximum Volume
    • 体積の最大値を求める
    • 長さを実際にaと置いて上限させ,すべてa置いた場合と比較するとすべてaの時に最大となることがわかる
    • 小数点のフォーマット方法
  • D - Banned K
    • N個のボールの組み合わせを数え上げる問題
    • HashMapに各値がいくつ存在したかを記録
    • マップからValueのイテレータをとってすべてにfoldで足し算を行うおしゃれテクを身に着けた

abc161

  • A - ABC Swap
    • はこの中身を入れ替えた結果を出力する
  • B - Popular Vote
    • 人気商品をM個選べるか調べる問題。
    • 商品の得た得票数順にソートしてm-1番目の値が選ばれるかを調べる
  • C - Replacing Integer
  • D - Lunlun Number
    • Backtrackingを用いて前後の値-1 ~ +1の値を連結していってLunLunナンバーを作っていく。

abc162

  • A - Lucky 7
    • 与えられたすうのいずれかの桁に7が含まれるかを調べる問題
  • B - FizzBuzz Sum
    • FizzBuzz(3, 5)で割り切れない値のみの合計を出力する
  • C - Sum of gcd of Tuples (Easy)
    • 最大公約数を返す関数を用いて3つの値の最大公約数を求める
  • D - RGB Triplets
    • 文字列のなかから3つの文字を一つづつ選ぶパターンを数え上げる(r * g * b)
    • さらにそこから条件(j - i != k - j)の組み合わせを引く(j - i == k - jからkを求める二次式を作る)

abc164

abc165

abc166

  • A - A?C
    • 文字列入力,比較
  • B - Trick or Treat
    • 複雑な入力,ループとか
    • ベクタのソートと重複削除,要素の確認
  • C - Peaks
    • ベクタのフィルタと数え上げ
  • D - I hate Factorization
    • 式の答えを出すことができる範囲を求めて総当たり計算させる
    • 制約よりループの範囲を求めることでできる

abc167

abc168

abc169

  • A Multiplication 1
  • B Multiplication 2
    • ひたすら掛け算した値を作成する
    • ベクタに0が含まれているかを探す .find(|x| x == &&0)
    • なければひたすら掛け算 & 境界チェックを行う
  • C Multiplication 3
    • 掛け算結果の小数点以下を切り捨てて出力する問題
    • // 1.19 -> 118.999 ... + 0.5 -> 119.222
    • // 1.18 -> 118.000
    • let bb = (b * 100.0 + 0.5).floor() as u64;
    • dobule値のずれのことも考えて +0.5 とかしてあげる
  • D Div Game
    • 素因数分解していく問題
    • HashMapで素因数分解を返してそれをもとに解く

abc170

abc171

  • A - αlphabet
    • 文字の範囲 a-z A-Z の判別
  • B - Mix Juice -ソートして小さいものから順番に足すだけ
  • C - One Quadrillion and One Dalmatians
    • 26進数の計算、ずれる分は商-1することでケアする
    • abc, 123でサンプルを作るとわかりやすい。
    • あまりが0のとき-1したら上のけたを揃えられるため場合分けする。
    • 文字列と数字の変換をしている u2c, c2u.... to_digitとか使ってみた
  • D - Replacing
    • 指定した値を指定した値に入れ替えていく問題だが全部いれかえて計算すると間に合わない
    • まずすべての合計を調べておいていくつの数字が入れ替わったかで合計を計算で求める
  • E - Red Scarf
    • XORを同じ値に対して奇数回しても変わらないことを生かして全体のXORをとってその他の値とXORをとることで自身の値がわかる
    • 数学的問題

abc173

  • A - Payment
    • 1000円札のみで支払った際のお釣りを求める
  • B - Judge Status Summary
    • 文字列の数え上げ
    • AC, TLE, WA
  • C - H and V
    • オセロのひっくり返すやつ的な
    • 選んだ列を塗りつぶしてのこりの色は何個あるか調べる
  • D - Chat in a Circle
    • 2分木的なもの
    • 条件から法則を見つければ解ける系問題
    • 環状にならぶのはわかりにくいからスタート地点を両端においた線をつくるとわかる

abc174

  • A - Air Conditioner
    • 数字の大きさ比較
  • B - Distance
    • 座標の計算、距離の計算
    • sqrtは大変だから2乗されたままで計算することがミソ
  • C - Repsept
    • 倍数が登場するのは何回目か調べる
    • modの世界で余りがループし始めたら以降も割り切れるものは登場しない
  • D - Alter Altar
    • 石を入れ替えていって条件にあう形にするまで何回かかるか探索
    • 入れ替え回数を数え上げる
  • E - Logs
    • 木を最小に切る問題
    • いくつの大きさに切れば条件の回数以内に切れるかを2分探索する

abc175

  • A - Rainy Season
    • 同じ文字が連続で現れる最大個数を数え上げる
  • B - Making Triangle
    • 三角形を作ることができる棒を選択する組み合わせを総当たりで調べる問題
  • C - Walking Takahashi
    • 数直線を移動して原点からの距離をとる -> 絶対値ですべて正の空間で考える
    • 移動を数式化する, 原点までたどり着けるパターン, できないパターン

abc176

  • A - Takoyaki
    • たこやきを指定数焼くには何分ほしいか
    • あまり切り上げ算
  • B - Multiple
    • めちゃ大きい数をたしていって9の倍数か判定する
    • 文字列化してやれば行ける
  • C - Step
    • 踏み台の高さが合計いくらほしいか
    • それまでの高さを保存してそれを超えられるように踏み台を足していく
  • D - Wizard
    • 完全に読み間違えて行ける範囲をすべて1増やしていた
    • ダイクストラ法的な行ける範囲を何回で行けるかで塗りつぶしていくゲーム

abc177

  • A - Don't be late
    • 時間と速さの計算、予定時間に間に合うか
  • B - Substring
    • 何文字書き換えると部分文字列が一致するかを調べる
    • forで総当たりして一番短くて済むものを出力させた
  • C - Sum of product of pairs
    • 二十シグマの計算、
    • なんか式変形するとシグマをひとつに減らせて時間内に収まる
  • D - Friends
    • AとBが友達、BとCが友達ならAとCも友達とするグループ分け
    • UnionFindなるものを実装した
      • どのグループか、グループには何個のノードがあるかがわかる
    • これ便利そう

abc179

  • A - Plural Form
    • 文字列の末端をみて付け足して出力する
  • B - Go to Jail
    • モノポリー問題
    • さいころを3回続けてぞろ目にしたときに表示する
  • C - A x B + C
    • 計算パズル系
    • 3変数で特定の値を作ろうとしてるように見えて実は1変数で何個の組み合わせを作れるかはわかる
  • D - Leaping Tak

abc178

  • A - Not
  • B - Product Max
    • 最大値を作る組み合わせを考える問題
    • 考えられる最大値のパターンが少ないことを利用して総当たりする
  • C - Ubiquity
    • 計算で求める式を求め実装する
    • ネックなのは大きくなったら 10^9+7 でmodをとるところ
    • 一番大きなものだけ取っちゃうと符号が-になることを利用してその分 10^9+7 を足して補正する

abc180

abc181

  • A - Heavy Rotation
    • 白服、黒服を交互に切ることになるのでN日後が偶数後日目か奇数後日目かを求めて出力
  • B - Trapezoid Sum
    • A~Bの値を順番に書いていくをN回繰り返す
    • A~Bの整数の合計は (A + B) * (B - A + 1) / 2
  • C - Collinearity
    • 2次元上に配置された点たちのなかで3点が同一直線状に乗っているものがあるかを調べる
    • 同一直線状 -> 2点のベクトルを求めて n倍したらもう一つの頂点にたどり着く
    • 比にして割り算をしないように掛け算の形にすること x, y の n が一致するならばOK
  • D - Hachi
    • 与えられた数字を並び変えて8の倍数を作ることができるか
    • 8の倍数は 下三桁が8の倍数ならばすべてが8の倍数
    • 与えられた数字をHashmapにいれて数字の出現回数を最大3で数える
    • Char型と数字の変換にc2uとかいうの使ったけど char.to_digit(n) でn進数に変換できるみたい強い
    • 組み合わせ列挙
      • numbers.into_iter().permutations(3).any(|perm| {
            let num = perm[0] + perm[1] * 10 + perm[2] * 100;
        }
        
  • E - Transformable Teacher
    • 先生の最適な身長を2文探索で求める
    • それまでの生徒の身長差合計とその後の身長差合計をあらかじめ累積和で求めておいて時短化させる

abc182

  • A - twiblr
    • フォロー数に制限があってフォロワー数からどうやって計算するか
  • B - Almost GCD
    • 日本語が難しい問題
    • 与えられた数列をできるだけたくさん割り切れる値を探す問題
  • C - To 3
    • 与えられた数字列から数字をいくつかけして3の倍数を作る
    • 3の倍数は与えられた数字の各桁合計が3の倍数ならよいことを生かしあまり1なら1あまりのものか2のもの2つを消し~~2なら2のものまたは1のもの二つ
  • D - Wandering
    • ロボットが移動していくのでいかに遠い場所に行けるか問題
    • 各工程でどこにたどり着くか、各回で一番遠いところはどこかをメモしておくことでOを下げることができる

abc183

  • A - ReLU
    • 0以上の値ならそのまま出力、以下ならば0を出力する関数を作る
  • B - Billiards
    • ビリヤードで反射させて目的地を通す問題
    • Y軸の比から間の座標を求めて出力する
  • C - Travel
    • 都市間を移動してすべての年を通る際のコストを見積もる問題
    • 順列を作ってくれる permutations を用いて実装した
  • D - Water Heater
    • お湯を使える量が決まっており、すべての人にお湯が供給できるか求める問題
    • どの時間にどれだけお湯がなくなって増えるかをまずすべて一つのベクタにまとめ
    • 最初から見ていって使う量が使える量を越えた場合にはNo

abc184

  • A - Determinant
    • 行列式を計算する問題
  • B - Quizzes
    • 初期得点が与えられてクイズに正解したら点数が増えて不正解で減る
    • 0よりは得点が小さくならない
  • C - Super Ryuma
    • 条件3つを使って動く角みたいな駒がある
    • 何回で目的の場所まで移動できるか
    • 1つ1つ場合分けをしっかりできるかの問題
    • 斜め移動は飛ばすところがいくつかでてくるからそこはmodが一致するか次第でわかる

abc185

abc192

  • A - Discount
    • 何割引きか計算する問題
  • B - Play Snuke
    • どの店に行くのが一番安くものが買えるか調べる問題
  • C - Unexpressed
    • 整数Nのうちa^bで表せない値の数を調べる問題
    • a^bで表せないものがすくないことを生かしてHashSet使っていい

abc194

  • C - Squared Error
    • 2重のシグマの中にある(a_i - a_j)^2を求める
    • n重ループするとO(N^2)で死ぬがa_iが小さい
    • i<=jを生かしてこれまでに到達したjがそれぞれいくつあるかを調べてメモして高速する

abc195

  • B - Many Oranges
    • a~bの重さのみかんをn個集めてちょうど重さWキロにする。
    • axn ~ bxnの間にw*1000があれば作れるよね(aのものを順番に入れ替えていけばできる範囲がわかる)
    • nの最大値を考えて全探索すればいい。
  • C - Comma
    • 数値に書かれるコンマの数を数える問題
    • それぞれの桁で書かれるコンマの回数をあらかじめ計算して書けばいい

abc196

  • C - Doubled
    • 数字を半分で切って、それを2連続で並べた際に入力内に収まるのはいくつあるか数える。
    • 半分で切った側をループさせて、それをつないだものが乳リュク外になるまでループさせればいい

abc197

  • A - Rotate
    • 3文字与えられて入れ替える
  • B - Visibility
    • マス目が与えられて見える範囲を答える

abc198

  • A - Div
    • お菓子の分け方の問題
  • B - Palindrome with leading zeros
    • 前に0をいくつかつけて回分にできるか調べる問題
    • うしろの0をとってから回文かしらべればいい

abc199

  • B - Intersection
    • 2つの数列のうち一番大きい数字と小さい数字をとって間を求める問題

abc200

  • A - Century
    • 切り捨ての位置をずらすために割る数-1を足してから割り算を行う
  • B - 200th ABC-200
    • 処理を繰り返すのみ
  • C - Ringo's Favorite Numbers 2
    • 10^9個の数字が与えられるのでそのうち組み合わせとして差が200の倍数になるものを探す
    • それまでに何回modが同じになる値が来ているかを数える
    • 新しいあまりができたらHashMapに1をいれてまた同じのが来たら+1していって数えた
    • 別にHashMapにする必要は200程度だしなかったなと...
  • D - Happy Birthday!
    • 余りが被る組み合わせを見つける
    • 2^8-1 通り(255通り)調べたら絶対にmod200の世界では被りが発生するよね??
    • 8個目までをbit全探索していけばOK
    • dp復元する実装があるらしい...

abc201

  • A - Tiny Arithmetic Sequence
    • 等差数列にするにはどうしたらいいか
    • 小さい順に並べるか、総和がどれかの3倍になる
  • B - Do you know the second highest mountain?
    • 二個目に大きい数値を調べる
    • BTreeMapに入れて求めた
    • ベクタをタプルのキーでソートするやつで書き直してある
  • C - Secret Number
    • 暗証番号の記憶をもとに何パターンあるかを考える問題
    • とりあえず総当たりでそれが記憶にあてはまるかを数え上げることで調べる

abc203

  • A - Chinchirorin
    • 3つの入力のうち同じものがあったら残りを出力するをifでやりまくる
  • B - AtCoder Condominium
    • マンションの部屋番号を足す問題
    • 変化するところをみてループを作ればいい
  • C - Friends and Travel costs
    • 持っているお金で村を進んでいく問題、途中の村にはときどき友達がいてお金をくれる
    • 愚直にやるとTLEなので村人の人数はいけるからそちらでループを回す
    • 村人を近くの村から順に並べてたどり着いた村人が行ける範囲内かどうかみて生産するor終了判定する
  • D - Pond
    • 高さがわかる公園のなかで選んだ範囲の**値が最も低いところを探す
    • 四角の中の値の和は累積和でO(n)で計算できる
    • 高さを超えているものを数えてどの高さなら低いものが求められるか2分探索する
    • 2分探索はO(log(maxA))
    • マス目の中の値を求めるのと2分探索ができないと解けない問題
  • E - White Pawn

abc204

  • A - Rock-paper-scissors
    • じゃんけんして相子になる手を選ぶ問題
  • B - Nuts
    • 一定の値を超えた樹からのみ木の実を収穫し、合計を出す
  • C - Tour
    • 国と国をつなぐ道が与えられるのでスタートとゴールの組み合わせを出す問題
    • TLEでなやんでいたけどこれメモリオーバーもTLEとして出力されるらしい
    • HashmapなんてCloneしちゃだめ
  • D - Cooking
    • 2つのオーブンを使って料理を作る。
    • 最も短い時間でできるのは何分かを求める問題
    • 料理を選ぶことでできる時間でDPを作って作れる時間をTrueにしていく
    • 2つなので半分以上の時間で最も短い時間を出力する

abc205

  • A - kcal
    • カロリーを求める問題
  • B - Permutation Check
    • 与えられた数列から順列がつくれるか調べる問題
  • C - POW
    • 与えられた数をもとに乗算の大小を求める問題
    • Cが2の倍数かで場合分けをして適切に処理する
  • D - Kth Excluded
    • 2分探索祭り
    • 昇順で並べられた数列が与えられてそれらを除いた数列のk番目を考える問題
    • 答えの数値を二分探索していく
      • 条件: mの値より小さいなかで最も大きな除外される数を見つけてm-何番目か、それがkより大きいか

abc206

  • A - Maxi-Buying
    • 税込みでいくらになるか調べる問題
  • B - Savings
    • 毎日経過日数分足し算していっていつn円を超えるか
  • C - Swappable
    • うしろから見ていっていくつ違う数字が既出かを調べて数え上げる問題
    • 組み合わせをこれで調べられる
  • D - KAIBUNsyo
    • 回文を何個数字を変えれば作れるか調べる問題
    • 変更される者たちをUnionFindでまとめていく。
    • 子になるものたちがいくつあるかが変化させられた数字

abc207

  • A Repression
    • 3枚渡されたカードの中で大きい要素を足し合わせた値をだす
    • ソートして2つ選んだ
  • B Hydrate
    • 何回か繰り返して特定の値を越えることができるかの式を作る問題
    • 割り算があるときに0ができる場合、Ifの中に&を入れるとWAる
  • C Many Segments
    • 開区間と半開区間、閉区間が混じっていて面倒な形の共通部分を求める問題
    • 倍にして1を足したりひいたりしてうまく差を吸収して場合分けを作る
  • D Congruence Points
    • 与えられた座標たちを回転させて別の座標たちと一致する形になるかを調べる問題
    • WAった
    • Vec<(usize,usize)>をコピーして値を変形して別のVec作ったりとかできるようになった

abc208

  • A - Rolling Dice
    • さいころを振って特定の数字ができるか求める問題
    • 最大だけでなく最小もあることに注意
  • B - Factorial Yen Coin
    • 1!, 2!... が流通する世界でk円をはらうには最小で何枚のコインが必要か調べる
    • 1円をたくさんあつめていくつかを2!に変えて...ってする手や最大の値から調べていく手、いろいろ
  • C - Fair Candy Distribution
    • おかしを配っていってのこりを特定の数値以下のひとに配る

abc210

  • A - Cabbages
    • N個キャベツを買うのでうまく条件分岐させて割引を適用する
  • B - Bouzu Mekuri
    • 交互に順番がくるので先に1をひくプレイヤーを調べる問題
  • C - Colorful Candies
    • 特定の範囲内のキャンディの種類の数を調べる問題
    • 差分をとって追加と削除を行うことで高速化する
  • D - National Railway
    • 2つの駅を作ってコストが低く作れるところを探す問題
    • 特定の点と特定の点をつなげる必要があるならそれはDPでは?????
    • 南東にしか2つ目の駅がないパターンと南西にしかないパターンを作って2回回せばいい

abc211

  • C - chokudai
    • 典型的なDP問題
    • 与えられた文字列からいくつのchokudaiを作れるか調べる
    • その文字を選ぶか選ばないかのDPを作り、文字列のi番目まででchok...をそれぞれ何通り作れるか

abc212

  • A - Alloy
  • B - Weak Password
    • 文字列がすべて一緒、または循環する数だったら弱いとする。
    • 文字列で読んだ値を数値にしていたりする u2c
  • C - Min Difference
    • 2つの数列のなかで差分の小さな組み合わせを求める問題
    • どちらもソートして前後だけを比較すれば計算量を抑えられる
  • D - Querying Multiset
    • BTreemapに詳しくなった、WAったけど
    • 重複する可能性がある + 最大 or 最小がわかればいい -> BinaryHeap
    • 最小を求めるときはReverseをつけてpushする必要がある。

abc213

  • A - Bitwise Exclusive Or
    • 数字のXORを取る問題
  • B - Booby Prize
    • スコアをタプルに何番目の選手かとセットでいれソートする。
    • 小さいほうから2番目がだれかを出力する
  • C - Reorder Cards
    • 与えられた数字だけで構成される行列をつくる(座標圧縮)
    • 与えられた数字が何番目に小さいかを調べるために二分探索する

abc215

  • A - Your First Judge
    • 文字列入力をできるか、一致判定
  • B - log2(N)
    • 2^k <= n となる最大の値を探す
  • C - One More aab aba baa
    • 与えられた文字列を並び変えてできる文字列(Permutation)を全列挙する
  • D - Coprime 2
    • 与えられた数字たち全部と互いに素な数字を列挙する
    • まずは与えられた数字を素因数分解して要素を調べてエラトステネスの篩にかける

abc217

  • A - Lexicographic Order
    • 文字列を辞書順にする、
    • もともとの順番と変わっていたら出力する
  • B - AtCoder Quiz
    • 4つの文字列のなかで出現していない文字列を調べる問題
    • あらかじめ文字列列をつくって置いて出現したらDeleteするとかでもよかったかも...
  • C - Inverse of Permutation
    • 文字列の順番を適切に入れ替えるだけ
  • D - Cutting Woods
    • 必死にヒープ木をかくもTLEった。平衡2分木にすれば良かったらしいがWAったので諦め
    • BTreeSetで指定した値以上の値を取得する方法があるらしい...
      • xよりも大きな(小さな)値の一つ目を取れる
        • let r = s.range(x..).next().unwrap();
        • let l = s.range(..x).rev().next().unwrap();

abc218

abc219

  • A - AtCoder Quiz 2
    • 数字をもとになにランクかを求め、次に上がるまでのランクを求める
  • B - Maritozzo
    • 文字列を指定された順番で連結する
  • C - Neo-lexicographic Ordering
    • 与えられた文字列をオリジナル辞書順で並び変えて出力する
    • オリジナル辞書順の文字列を通常文字列に変換してなんとかした
  • D - Strange Lunchbox
    • 弁当箱に入ったたこ焼きの個数合計が指定した数を超えるにはどれだけ弁当を買えばいいか調べる

abc220

  • A - Find Multiple
    • a~bの間に収まるcの倍数を探す
    • bをcで割ってcかけた値がa以上ならOK
  • B - Base K
    • 進数変換
    • 与えられたk進数を10進数に直して掛け算する問題
  • C - Long Sequence
    • 与えられた数列ans個まで足したらxをsumが越えるansを求める
    • 数列のsumをもとに何回数列使えるか調べてのこりは数列をただ回す
  • D - FG operation
    • DP問題!!!
    • 数列を順番にたしかけして作られる1の位が何通り作れるかすべて洗い出す問題
    • 1の位は10種類しかないことに注目して数列x1の位のDPを作る

abc221

  • A - Seismic magnitude scales
    • マグニチュードの計算を行う
    • 32のn乗になるからその回数ループ回す
  • B - typo
    • 文字列がどこか一か所を入れ替えるだけで一致させられるか調べる問題
    • 場合分けしまくって隣り合った2文字だけが違って入れ替えたらいける条件を作った
  • C - Select Mul
    • 与えられた数字を2つに分離してつなぎあわせ、掛け算した結果が最も大きくなるとこを探す
    • bit全探索で2つに分離、合計が0ならパス、大きい数字順にソートして数字を作る、かける
  • D - Online games
    • オンラインゲームにログインしている人数がn人だった日が何日あるか全部列挙する問題
    • 入った日と抜けた日を数列にして+-をしていく
    • 数列を回して日付が変わったらそれまでの人数に経過した日数を足す

abc223

  • A - Exact Price
  • B - String Shifting
    • 文字数回分までシフトした文字列をすべて作る
    • ソートして一番多いものと少ないものが答え
  • C - Doukasen
    • 何種類かの導火線が並べられてて左右から火をつける
    • どこで火が合わさるかを調べるために片方だけにつけたとしたら何秒かかるか調べる
    • 全部燃えきる半分の時間でどこにいるかを調べる
  • D - Restricted Permutation
    • トポロジカルソート
    • ループ検出機能付きのソートにするために行き掛けと帰りがけ、両方でチェックをかけられるようにする

abc224

  • A - Tires
  • B - Mongeness
    • マス目を4点選びそれが与えられた条件に沿っているか全探索する問題
  • C - Triangle?
    • 与えられた点から3点を選んで三角形ができるパターンの個数を数える。
    • 1直線に並んだときにできないことを生かして3点が並んでいたら数えないをする。
      • 判定方法: 傾きが一致しているなら× or 外積 → 傾きでやった
  • 8 Puzzle on Graph
    • 9つの島と1~8の駒が存在する。
    • 駒と島の数字が一致するように駒を移動させていけるかの問題
    • 島は与えられた道で繋がる、駒のない島にたいして駒は移動できる
    • 島と駒の組み合わせをは9!通り、最短路問題として処理したい(目標の状態に持っていくには) → BFS
    • 行けるところと順番に入れ替えていってMapにないならどんどん追加してすべて試す

abc225

  • A - Distinct Strings
  • B - Star or Not
    • 枝が渡されるのでスターになっているかを調べる
    • 各頂点の辺の数をしらべて残りすべての頂点に出ていたらYes
    • HashSetで宛先頂点を記録することで複数の辺が入っていても大丈夫
  • C - Calendar Validator
    • 数列が特定の数列の一部かを判断する
    • 数式の特性上現れないパターンが出てきたらはじくようにする

abc231

  • A - Water Pressure
  • B - Election
    • 一番多く出てきたstringを求める問題
    • HashMapに回数を入れて &map.values().max().unwrap(); から最大数Valueを取得する
    • 一致するKeyを探して出力
  • C - Counting 2
    • クラスメイトの身長が与えられるので2分探索で与えられた値より大きな人数を調べる
  • D - Neighbors
    • 隣合う人の条件一覧を渡されるのですべての条件を満たして人を1列に並べることができるか調べる問題
    • 隣合えなくなる条件
      • 1人に対して3人以上隣り合おうとする
      • 隣り合おうとする人でループができる
    • ループ検出 -> UnionFindを用いる

abc232

  • A QQ solver
    • 文字列で与えられた式を計算する問題
    • 数字の文字列を変換するc2uを書いて利用した
  • B Caesar Cipher
    • 与えられた文字列SをROTxしてTにできるか判定する問題
    • 1文字目からxを求めてのこりでうまくいくか試す
  • C Graph Isomorphism
    • グラフが一致するかを調べる問題
    • 頂点が8つしかないことを生かして頂点の名前を順番に入れ替える
    • permutations をつかうことで入れ替えていける
  • D Weak Takahashi
    • 1,1からスタートして壁を進まずにマス目を進んでいく
    • x+1, y+1 でしか移動できないときにMAXどこまでいけるかを調べる
    • DPしたらできた

abc234

  • A - Weird Function
    • 関数を定義して式を計算する問題
  • B
    • 三角形の斜辺の長さを総当たりで求める問題
    • 平方根、std::cmpが使えないとき(f64)のmaxを使う

abc236

abc239

  • A - Horizon
    • ルート(sqrt)の計算
  • B - Integer Division
    • ⌊10X​⌋ を出力する
  • C - Knight Fork
    • 2つの点が与えられるのでお互いルート5の距離になる点に被る駒があるか調べる
    • 格子点には8つしかその距離になる点がないことを生かしてHashSetに格子点をすべて入れる
    • もう1つも入れて被る値があるか調べる
  • D - Prime Sum
    • 2人でそれぞれ決められた範囲の値を言う
    • 合計で素数になるなら後攻の勝ち、言えなければ敗け
    • エラトステネスの篩で範囲内の素数一覧を作成、2人の言える範囲で最大何回連続素数でなくせるかを調べる
    • 2人目の作れる範囲よりも大きいなら先行の勝ちになる

abc242

  • A - T-shirt
    • Tシャツがもらえる確率を求める問題
  • B - Minimize Ordering
    • 辞書順で文字列ならびかえ
    • RustならSortでできる
    • s.iter().collect::() でCharsは文字列にできる
  • C - 1111gal password
    • すべての桁で|となりの桁-前のけた| <= 1となるn桁の数がいくつあるか求める問題
    • DPで埋めていく
  • D - ABC Transform
    • 文字が規則的に倍の長さに増えていく、特定の段tのk文字目がなにかを調べる問題
    • 左に行く回数、右に行く回数でなにになるか A→B→C の順で変化することを見つける
    • 文字列を数字に変換する操作とかある(c2u)
  • G - Range Pairing Query

abc244

  • A - Last Letter
  • B - Go Straight and Turn Right
    • 進む方角を決めて与えられた指示の回数進んでいく問題
    • 進む方向に合わせた計算オフセットを用意してそれで進める
  • C - Yamanote Line Game
    • インタラクティブにやれと言われた
    • なぜかRustでできなかったからcppで書いた
  • D - Swap Hats
    • 文字列を偶数回変換して特定の文字列になるかを判別する
    • 6パターンしかないので出来上がる文字をすべて列挙して変換先が含まれているか調べた

abc264

  • A - "atcoder".substr()
  • B - Nice Grid
    • 波紋のようなグリッドに対して与えられた座標が黒色か白色か求める問題
    • グリッドが小さいのでべた書きした
    • **からの距離をチェビシェフ距離を用いて求めるmax{∣R−8∣,∣C−8∣}と楽だったなぁと...
  • C - Matrix Reducing
    • aの行列からいくつかの行と列を取り除いてbの行列を作れるか
    • bit全探索を用いてどの列を使うかを考える
  • D - "redocta".swap(i,i+1)
    • 文字列を順番に入れ替えていってatcoderの文字列を作るには最小何回の入れ替えでできるか
    • BFS(深さ優先探索)を用いて入れ替えていく
    • 回数の情報はBFSの時点で一緒にキューに入れておく

others

joi2008ho

  • C - ダーツ
    • 4本までダーツを投げて得点Mを越えない最大得点を計算する問題
    • 2本総当たり順列を作って各値についてもう2本選んで最もMに近くなるものを2分探索で求める

code-festival-2017-quala

  • B - fLIP
    • オセロ的なひっくり返していくゲーム
    • どちらの列を選択したらいくつひっくり返るかを式にすると解ける

CADDi 2018

  • C - Product and GCD
    • 与えられた数列全部の掛け算した値がわかっているのでそこから数列の最大公約数(GCD)を求める問題
    • Factor(素因数分解)を求めて数列の数ぶん以上あるものをどんどんかけていけば求まる

keyence2019

  • C - Exam and Wizard
    • できるだけ少ない数の準備度を入れ替えて求められている試験度に達成する
    • 点数がたりないところを埋めるだけの点数をどこから用意するかを最小にする
    • 点数の余っているところを配列に入れてって大きいものから必要な点数をもらっていけばいい

みんなのプロコン2019

  • C - When I hit my pocket...
    • クッキーを割っては変換する問題
    • ただただ計算式を思いつけるかどうかが問われる

keyence2020

  • C - Subarray Sum
    • 問題の意味がわかればいいゲーム
    • 制約をもとに埋める値を変えたりしないといけないのは難しいところ
    • 10^9が与えられた時だけ制約を超えた値を入れないようにしたりとか
      • 出力長制限超過OLE とかいうのを見たらこれを疑え!

nomura2020

  • A - Study Scheduling
    • 時間の計算
  • B - Postdocs
    • "?"を置き換えて点数を最大化する問題
    • 全部Dに置き換えても最大になることに気が付かなった自分を殴りたい
  • C - Folia
    • 2分木の葉の数についての問題
    • 深さdの最大葉でない頂点の数はA_d+1 + A_d+2.. A_d+n だぁぁぁ泣いた

aising2020

  • A - Number of Multiples
    • 倍数の範囲を調べる、下限が倍数に含まれていた場合に備えて-1して倍数の数を求めている
  • B - An Odd Problem
    • 奇数番目の箱の中身が奇数のもののみを取り出す
  • C - XYZ Triplets
    • 式の答えが特定の値と一致するかの探索
    • 変数一つで最大値になる場合を求め、それを最大値としてループを回す
    • 一致するかはあらかじめ答えとして取りうる範囲のベクタを作っておいて一致するとこにどんどん代入する

Codefestival_2016_final

  • B - Exactly N points
    • ちょうど目的の点数をとるためにはどのように問題を解けばいいか。
    • このときの一番点数が高い問題が最小になるような場合を求める
    • 累積和を求めておき、合計値が目標点を超えた場合にそれまでの値を出力する
    • この際に目標値との差分を除外して出力する

hhkb2020

  • A - Keyboard
    • 指定された方法で文字列を変更して出力する、
    • 文字を大文字にしたり小文字のまま出力したり
    • もっとおしゃれにかけよってかんじの反省
  • B - Futon
    • 与えられたMapのうち2つ並んで空いている場所をさがして布団をしく
    • 右だけまたは下だけを見るを繰り返す
    • 最後の行と列は別で足す
  • C - Neq Min
    • 使ってはいけない値をHashMapに加えていく、
    • もしminが使ってはいけないリストに入っていたなら+1して入っていない状態までもっていく
  • D - Squares
    • 正方形の置くパターンがいくつあるかを数え上げる問題
    • シグマのループが (1 ~ Nまでの総和) x R と気づいたらこれはO(1)で求められるという
    • またこれが二つあったとしても (x) x (y) で分けられているならこれは後からかけてもいいという
    • 配置をするときは置く場所を区切って考えるとよい、
      • どこかに縦線を引いて右に1つあってもう一つは左にある的な

About

atCoderを解いていく


Languages

Language:Rust 99.3%Language:Python 0.5%Language:C++ 0.1%