Akhmad228's blog

By Akhmad228, 6 years ago, In Russian

Help me please.

I have problem.

Given array.

You have Q queries.

You need to find most frequent number between l and r. n, Q <= 500 000.

  • Vote: I like it
  • 0
  • Vote: I do not like it

»
5 years ago, # |
  Vote: I like it +3 Vote: I do not like it

Maybe, it can be solved by MO's algorithm with big constant(~5).

Let's maintain:

cntx -> the number of occurance of x,

cntBlockx -> the number of elements, that occurrence lie in this block(if K is size of blocks, occurrence must be between [K * Block: (K + 1) * Block)).

valsx -> the vector with elements, that occurrence is equal to x.

When adding/removing elements, we must update each of them. Deleting can be done in 1 operation. Swap with last, delete last(maintain extra array posx, the position of x in vector).

Finding answer will be ez. Find maximum block mx that, cntBlockmx > 0, find maximum number x in this block, that vals[x].size() > 0.

Sorry for my poor English.

»
5 years ago, # |
  Vote: I like it 0 Vote: I do not like it

Do you know smth about segment tree?