1

(4 ответов, оставленных в Feedback)

И в сличае с n^2... smile

2

(4 ответов, оставленных в Feedback)

на результат это не повлияет..

А вот с выводом похоже надо

if (min_e[v] != -1)
        cout << v << " " << min_e[v] << endl;
поменять на


if (sel_e[v] != -1)
        cout << v << " " << sel_e[v] << endl;

3

(3 ответов, оставленных в Problems)

Сдалась с таким же решением но на segment tree.

4

(3 ответов, оставленных в Problems)

декартово дерево добавляет большую константу.  Попробуй с помощью segment tree.

5

(12 ответов, оставленных в Problems)

Красиво. Вроде должно работать smile
Только с левой нижней надо аккуратнее проверять что б не пропустить перевернутую T - как-то
if (y < 0 || y == 0 && x < 0) return

6

(12 ответов, оставленных в Problems)

Сначало генерируй один длины 1 из них прибавлением всех возможных соседей по ребрy длины 2. итд
на каждом шаге убирай дубликаты. На размер поля на этом шаге не смотри - потом готовые замки двигать будешь

7

(4 ответов, оставленных в Feedback)

Не. Тоже так нельзя

Вот такой прходит:

void update_y (int vx, int lx, int rx, int vy, int ly, int ry, int x, int y, int new_val) {
    if (ly == ry) {
    
        if (lx == rx)
            t[vx][vy] = new_val;
        else
            t[vx][vy] = t[vx*2][vy] + t[vx*2+1][vy];
        return;

    }
    else {
        int my = (ly + ry) / 2;
        if (y <= my)
            update_y (vx, lx, rx, vy*2, ly, my, x, y, new_val);
        else
            update_y (vx, lx, rx, vy*2+1, my+1, ry, x, y, new_val);
    }
    t[vx][vy] = t[vx][vy*2] + t[vx][vy*2+1];
}

Тестировал на




void Test()
{
    N = 20;
    M = 20;

    memset(t, 0, sizeof(t));

    vector<vector<int> > c(N, vector<int>(M, 0));

    for (int nTest = 1; nTest <= 20000; nTest++)
    {
        int x = rand() % M;
        int y = rand() % N;
        int val = rand() % 1000;

        update_x(1, 0, M - 1, x, y, val);
        c[y][x] = val;

        int tx = rand() % M;
        int lx = rand() % (tx + 1);

        int ty = rand() % N;
        int ly = rand() % (tx + 1);

        val = 0;
        for (int x = lx; x <= tx; x++)
        {
            for (int y = ly; y <= ty; y++)
                val  += c[y][x];
        }

        int val2 = sum_x(1, 0, M - 1, lx, tx, ly, ty);
        assert (val == val2);

    }
}

8

(12 ответов, оставленных в Problems)

Нормальная задачка...

Сдалась с такой идеей - сначала генерирую всевозможные замки с длиной K (для K = 10 их не больше 40000)
Для каждого из замков проверяю куда его можно пропихнуть.

9

(4 ответов, оставленных в Feedback)

Есть подозрение что на странице http://e-maxx.ru/algo/segment_tree  в update_y  пропущен


t[vx][vy] = t[vx][vy*2] + t[vx][vy*2+1]);

для случай ly != ry

10

(2 ответов, оставленных в Algo)

+1. Тоже сегодня это заметил...   -6.99   например плюс +0.5 станет -6...


@a13n  значит с fft  она всетаки должна пройти... smile

11

(7 ответов, оставленных в Problems)

На практике лучше просто обрезать по int/long long (что по сути тот же модуль)  так будет быстрее и больший диапозон хешей.

12

(7 ответов, оставленных в Problems)

В этом то и фишка хеша что нам не надо его полностью вычислять достаточно обрезать по int/long long или по модулю большого числа. Вероятность ошибок остается мизерной.
Алгоритм http://e-maxx.ru/algo/rabin_karp продолжает работать даже при строках в N = 100000.
Еще раз перечитай  http://e-maxx.ru/algo/string_hashes.

13

(7 ответов, оставленных в Problems)

можно стандартно хешами.

14

(9 ответов, оставленных в Problems)

Неизвестно. Но нам его выводить и не надо.

15

(9 ответов, оставленных в Problems)

В третем примере нас просят узнать элементы Z с первого по десятый (считать нужно с 0)

например ищем Z[1]

Z = zip Z S

значит Z[1] = S[0]

S = 4 3 2 1 A
значит S[0] = 4  и Z[1] = 4.

etc.

16

(9 ответов, оставленных в Problems)

Оно тебе надо? smile Если месяц не понять условие задачи может проще перейти к следующей? :-)

17

(3 ответов, оставленных в Problems)

Длина N <= 4 - можно легко пересмотреть все варианты разбиений и проверить есть ли такие ki.

18

(9 ответов, оставленных в Problems)

Вкраце - в первых N строчках объявляются списки
В следующих M - вопросы найти элементы одного из списков с "s" по "e".
N и M в первой строчки

19

(12 ответов, оставленных в Algo)

Все получилось. Спасибо большое smile

20

(12 ответов, оставленных в Algo)

Не получилось.
В формуле ошибка при группировке (1*2*.. * (p-1))   и ((p + 1)*(p + 2)... 
так как мы вычисляем по модулю (p ^ q)  -> p + 1 != 1)


например p = 3, q = 2   у нас не получится сгруппировать (1 * 2) и (4 * 5)


Пробую группами не по p а по p^q тоже фигня  получается.

21

(8 ответов, оставленных в Problems)

Рекурсия / бектракинг / перебор / динамику тут можно сделать если бы точно можно было бы сказать что студентов не больше 20.  А так - даже не знаю smile

22

(12 ответов, оставленных в Algo)

Спасибо, Ярослав. Буду пробовать.

23

(12 ответов, оставленных в Algo)

То что Китайская теорема работает это ясно - я имел ввиду что подсчитать коэффициент по модулю pi^qi не сильно нам упростит жизнь если хоть у одного qi >1.

как мы например будем считать коэффициент по модулю 16...

24

(8 ответов, оставленных в Problems)

Вроде http://e-maxx.ru/algo/johnson_problem_2 твой случай.

25

(12 ответов, оставленных в Algo)

Так тоже не получится.  разложить на простые и восстановить получится только если M "square-free".