Помогите, пожалуйста, решить: удаление k-ых элементов из массива длины n пока в нем не меньше k элементов

Правка ru1, от dmkz, 2018-06-27 00:10:12

Здравствуйте! Помогите, пожалуйста, решить следующую задачу: 736. Удаление с acmp.ru. Суть задачи: на каждой итерации из массива длины n до 5·106 удаляются элементы с индексами k, 2k, 3k и т.д. Затем все неудаленные элементы сдвигаются и операция повторяется до тех пор, пока длина массива не станет меньше k. Нужно для каждого элемента во вводе сообщить, каким по счету он уйдет.

Мое решение — явная обработка каждого запроса:

#include <stdio.h>
 
inline int solve(int n, int k, int a) {
    int answ = 0;
    while (a >= k && a % k != 0) {
        answ += (n - answ) / k;
        a -= a / k;
    }
    answ += a / k;
    return answ;
}
 
int main() {
    int n, k, q;
    scanf("%d %d %d", &n, &k, &q);
     
    while (q--) {
        int item;
        scanf("%d", &item);
        printf("%d\n", solve(n, k, item));
    }
     
    return 0;
}

Решение получает TLE, видимо, нужно как-то сгруппировать запросы, а то, скорее всего, при таком наивном подходе сложность получается порядка O(q*n). До этого предпринималась попытка для каждого элемента предподсчитать ответ, что также дало TLE.

Была идея с деревом Фенвика за O(n log(n)^2), но она не пройдет по времени.

Теги структуры данных

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru11 Русский dmkz 2018-06-28 17:38:26 19
ru10 Русский dmkz 2018-06-28 17:35:44 1595
ru9 Русский dmkz 2018-06-27 16:52:33 89
ru8 Русский dmkz 2018-06-27 16:31:38 8
ru7 Русский dmkz 2018-06-27 16:30:02 351
ru6 Русский dmkz 2018-06-27 16:10:42 20
ru5 Русский dmkz 2018-06-27 16:10:15 195
ru4 Русский dmkz 2018-06-27 14:50:23 126
ru3 Русский dmkz 2018-06-27 02:41:27 393
ru2 Русский dmkz 2018-06-27 02:25:54 1390 Мелкая правка: 'вствуйте! [736. Уда' -> 'вствуйте! Задача [736. Уда'
ru1 Русский dmkz 2018-06-27 00:10:12 1425 Первая редакция (опубликовано)