0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

atcoder_水色精進記録18_ABC396f

Posted at

Atcoder水色精進記録

ABC396
F - Rotated Inversions
https://atcoder.jp/contests/abc396/tasks/abc396_f

アルゴリズム・データ構造

SegTree, FenwickTree

考察

N,Mが2*10**5なので
愚直な全探索は負荷
Kの値に対して、O(1)orO(logN)くらいの計算が必要そう
→事前に何か計算しておくか、差分のみ考えることができないか。

K=0の時の転倒数はO(N)でカウントできる?
現在のiより左にAiより大きい値の数を覚えておく必要がある。
各数字の出現数を管理することでできる?
→普通に管理すると最大i-1個の数字を確認することになるのでO(N**2)となる。
→SegTreeで管理することでO(NlogN)で行けそう。

K=1になったらどう変わる?
Ai+KがMになる場合、0になり、他の要素との転倒関係が変わる
M未満に場合、他の要素も全て+1されるため転倒関係は変わらない
Ai+Kが0になった場合、
その要素より左側は全て転倒数に加算する必要がある。(同時に0になったものは注意)
(1loop前はその要素が最大なので、その要素より左側の数は全てその要素より小さい)
その要素より右側は同じ値となる要素以外は転倒で無くなる
(1loop前はその要素が最大なので、その要素より右側は全て転倒count)
差分に着目するとO(1)で計算できそう。

提出

感想

Segtreeを使って無駄なことをしていたら定数倍でギリギリTLEとなった。
FenwickTreeだと無駄なことをしていてもかなり余裕を持ってACとなった。
https://atcoder.jp/contests/abc396/submissions/64677680
FenwickTreeでいい場合はこちらの方が安全(特にpythonだと)なので、FenwickTreeを空で描けるようになる必要がある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?