AB+CD=N」が4、5回読んでも理解できなか
i&-i
で。部分集合の列挙は b = bits
と初期化してから b = bits&b-1
で。メインはメモ化再帰。やりやすいからこういう方法でや最終更新: 2023-03-03T18:23+0900
赤にな[Z+X,Y].max
正整数 を 100 で切り捨て除算する。桁数が 50 万と 1 になることがあるのでうgets.to_i
してはいけない。いや、案外平気かも。文字列として2桁削るのが無難だけど N が2桁以下のときに 0 を出力するのを忘れない。
出目の和ごとに場合の数を記録する DP。6×6×6×18 程度の計算量。
辺の集合が与えられたときに多重辺と自己ル
強いて注意点を挙げるなら、多重辺を調べるときに文字列のまま比較すると 1 2
と 2 1
の同一性を見逃してしまうことと、隣接頂点リストを配列として持つと星型のグラフで多重辺のチ
問題文に書かれている通りにスコアを消費してい
限られた数の薬と数限りないアレルゲンがある。薬が含むアレルゲンと人が持つアレルギ
制約を見ないと方針が決められない。薬は最大 100 種類。アレルゲン/アレルギ
人が持つアレルギ
N が 1000 以下、L と K が 10 以下に抑えられているので、一致しているべき文字のインデ
問題文から読み取るべきこと。銀貨が有限だが無数にあると考えていい枚数ある一方、銅貨は X 枚に限られている。両替はできない。金銀銅の価値は差が非常に大きく、価値の大きい貨幣の多寡を価値の小さい貨幣でひ
なので、X 枚の銅貨をできるだけ多くの金貨に変えることをまず考え、金貨の枚数が同じ場合に使用した銀貨の枚数を少なくすることを考える。
そこまで分かれば銅貨の枚数ごとに金貨と銀貨の枚数を記録する DP をやるだけ。
悲しさを考える前にまず m で割a%m,2*a%m,3*a%m,...,n*a%m
について考える。d = gcd(a,m)
とおく。m 種類の余りは周期 c = m/d
のサイクル(d 個)に縮約される。それは次のようなスクリプトで可視化すればわかる。問題を解くだけなら証明はできなくてもいいでし
n,a,m = 10,6,10 # d=2 p (1..n).map{|i| a*i%m } #=> [6, 2, 8, 4, 0, 6, 2, 8, 4, 0] 周期 c = 5 n,a,m = 10,10,6 # d=2 p (1..n).map{|i| a*i%m } #=> [4, 2, 0, 4, 2, 0, 4, 2, 0, 4] 周期 c = 3
サイクルの和は初項 0、公差 d、項数 c の等差数列の和なので c*(c-1)/2*d
。サイクル当たりの悲しさは、余りが 0 の項の悲しさが 0 であることに注意して m*(c-1)-(サイクルの和)
。
サイクルから外れた n%c 個の悲しさをどう求めるか。一発で求まる式があるとは知らない。m が 300 以下の制約だから 10 万件のテストケ
n%c と c-(n%c) を比較して、n%c の方が小さいなら悲しさを足し上げる、c-(n%c) の方が小さいならサイクル当たりの悲しさから引き算で逆算することにして、最悪 1500 万の処理量ならまあまあありだと思う。同数ならど
n%c の区間をどんどん割
長方形と円のどちらかがどちらかを含む場合を除けば、扇型の面積から直角三角形の面積を引いたり引かなか
扇型の面積(s)の求め方。半径を r、弧を l とすると s = r*l/2
。弧の長さ(l)の求め方。中心角(ラジアン)を θ として l = r*θ
。中心角(θ)の求め方。三角形の3辺の長さがすべて分か
ここまでわかればあとは場合分けを間違えないようにやる。
辺を繋いで連結判定をするのはおなじみ UnionFind で。辺を切断する方法は知らない。辺を繋ぐのが 10 回以下に制限されている一方、切断する回数はい
ヒントを見たよ。https://twitter.com/kyopro_friends/status/1630510505323540481
ポイントを抜き出せば「「最終的にmod3で何枚選ぶか」をkと先に決め打
」というだけのことが独力で解決できないのだな。
基本は絵画を順番に、選んだ個数を3で割
ある範囲のセ
i を増やしながら 1 から i 巻目までを揃えるのにかかる費用の最小値を記録していく DP をする。セ
単巻買いの場合、1 から i 巻目までを揃えるのにかかる費用の最小値(C[i])は C[i-1]+A[i]
。(A[i] は i 巻目単体の価格)
範囲の右端が i であるセmin(C[l-1],C[l],C[l+1],...,C[i-1])+b
。区間最小値はセグメント木にお尋ねします。
まだだよ。
まだだよ。
入力に矛盾しない A が存在する」という制約により除外されている。潜在的バグはバグではなか
if (1..N).all?{|n|
)だ最終更新: 2023-02-08T02:07+0900
a = b = 0 # 初期化 a += b += a += 1 # 本題 p a #=> 1? 2?
右から順番に a に 1 を足して(a=1)、b に a を足して(b=1)、a に b を足して(a=2)、と考えると間違える。「自己代入」を読むと「この形式の代入は
」と書かれている。一番右の 式1 = 式1 op 式2
と評価されます。ただし、op が &&, || の場合には(略)a += 1
が評価される前に一番左の a +=
が a = a +
と分解されていて古い a の値が評価中の式の値として一時的に記憶されているのだと考えられる。a の値は 1 になる。ちなみに C++ では 2 にな
この前の ABC288-D が解けなか