「良い数列」と呼ぶことにする。2進数表記し、任意の2つのbitを交換する。連続部分列で、「良い数列」であるものの個数を求めよ。考察まず操作について考える。あるような任意の数に変換できることが分かる。数」だけを保持すればよい。次に、ある数列が「良い数列」となる条件を調べる。XORの性質を考えると、以下のことが分かる。引く」という操作を考える。これは、証明が難しいが以下の2つの条件と同値になる。最大値は、それ以外の値の総和以下である。後者についてはを最大値とそれ以外に分ける。なるまで減らし続ける。一方は「それ以外の集合」の最大値を常に減らすようにする。よって上の2条件を満たす連続部分列の数を数え上げればいい。奇が一致していることが条件となる。パリティからなる累積和を取れば、前者を満たす区間の数は十分高速に求まる。Rangesと同じ手法。ここから2つ目の条件を満たさないものを排除していくが、これは全ての区間を調べる必要はない。以上の区間は全て2つ目の条件を満たすことになる。以下の区間だけ調べれば良い。危ない数値だが、ループ内の処理は単純なので何とか間に合う。累積和はindexがズレがちなので実装が疲れる。方針は合っていたが証明ができず、確信が持てなかった。実装は実装でindexズレやら勘違いで無限にバグらせた。なんか反省点が多い問題だった。長さの数列が与えられる。長さの数列が与えられる。「Attention」の解説。(300)ARC099-C「Minimization」の解説。公式はてなブログをはじめよう!misteerさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。