Блог пользователя Akhmad228

Автор Akhmad228, 7 лет назад, По-русски

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.

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
7 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

What about Time Limit?

»
6 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

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.

»
6 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Do you know smth about segment tree?