難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

XOR = OR

作成者 mackerel38

テスター yukimy32

難易度(作成者設定) Lv.5

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説

P0=0, Pi=A1⊕⋯⊕AiP_0=0,\ P_i=A_1\oplus\cdots\oplus A_i と定義する。

区間 [l,r][l,r] のビット単位 OR を vv とすると、この区間が条件を満たすことと

Pl−1=Pr⊕vP_{l-1}=P_r\oplus v

であることは同値である。

区間の右端 rr それぞれに対し、左端 ll を r,r−1,…,1r,r-1,\ldots,1 の順番に考える。区間 [l,r][l,r] のビット単位 OR は各ビットが 00 から 11 に変化することしかないため、異なる値は高々 3131 種類である。また、同じ値を取る ll は連続している。

したがって、ビット単位 OR が vv となる ll の範囲を [L,R][L,R] とすると、この範囲で条件を満たす区間の個数は

Pl−1=Pr⊕v(L≤l≤R)P_{l-1}=P_r\oplus v\qquad (L\le l\le R)

を満たす ll の個数として求められる。これは、 (Pi,i)(P_i,i) の列をソートし二分探索するなどして高速に求めることができる。

区間の右端を r−1r-1 から rr にすることを考えると、l<rl\lt r に対する区間 [l,r][l,r] のビット単位 OR は、区間 [l,r−1][l,r-1] のビット単位 OR に ArA_r を OR した値になる。

さらに、区間 [r,r][r,r] のビット単位 OR は ArA_r である。これらを求め、同じ値を取る連続した範囲をまとめればよい。

このようにすることで O(Nlog⁡max⁡Alog⁡N)O(N\log{\max{A}}\log N) などでこの問題を解くことができる。

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。