Задать вопрос
  • Как ввести адрес в cin?

    wataru
    @wataru Куратор тега C++
    Евгений Мартынов, Адрес у вас скорее всего 64-битный в системе. Замените int addr на size_t.
    И при выводе преобразуйте к size_t: std::cout << (size_t)&a, а то адреса выводятся в 16-ричном виде, а читает он чиста в 10-ричной системе.
    Написано
  • Почему код не работает?

    wataru
    @wataru Куратор тега Алгоритмы
    Это можно еще доказать: Вот искомый индекс, цифра в нем появилась на каком-то шаге. Длина последовательности каждый раз увеличивается вдвое. Вот на этом шаге можно вместо значения по искомому индексу, взять значение по тому индексу, откуда значение было скопировано в искомый индекс, и инвертировать. Если на этом шаге длина последовательности была 2^k, а искомый индекс x, то надо взять значение по индексу x-2^k. При этом получается 2^k <= x < 2^(k+1), раз на этом шаге x был заполнен. Значит надо вычесть из x самый старший значащий двоичный разряд и инвертировать значение там. Значит количество инверсий будет равно количеству значащих бит. Вот и получается, что надо взять четность количества единиц в двоичной записи.
    Написано
  • Как показать зависимость скорости от O(nlogn)?

    wataru
    @wataru Куратор тега Алгоритмы
    jidomasson, Да, но вы должны помнить, что О-большое - это ассимптотическая оценка. Она действует только на больших числах. Допустим, там, на самом деле 5n log n + 100sqrt(n) операций. Это все еще O(n log n). Однако, если вы n с 10 до 20 увеличите, то у вас время вырастет чуть более, чем в 1.414 раз, потому что 100sqrt(n) сильно больше 5n log n. Однако на больших n скорость роста будет задаваться именно n log n.

    Поэтому чтобы действительно намерить ассимптотическую сложность - надо брать большие n.
    Написано
  • Ошибка double free or corruption (out) Aborted, как исправить?

    wataru
    @wataru Куратор тега C++
    При компилировании? Точно? Или при запуске программы и вводе каких-то данных?
    Написано
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Maksym122,

    > В одном тесте теперь неправильные данные, а в других двух ограничение памяти превысило

    Поменяйте переменные на int64_t. Особенно tens, left, right. Наверно, там переполнение. В задаче ограничения на q не приведены, но если там действительно 2000000000, то могут быть проблемы.
    Написано
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Maksym122, Ну значит, надо как я говорил, применять математику:
    int S(int p, int q) {
      int sum = 0;
      for (int d = 1; d < 10; ++d) {
        for (int tens = 1; tens <= q; tens *= 10) {
          int left = p - d*tens;
          if (left < 0) left = 0;
          else left = (left + 10*tens-1)/(10*tens);
          int right = q - d*tens;
          if (right < 0) right = -1;
          else right /= 10*tens;
          sum += d*(right - left + 1);      
         }
      }
      return sum;
    }
    Написано
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Maksym122, Если не хватает стека, программа упадет с runtime error.
    Переполнению тут особо негде и случатся, а если оно и есть, то ну получите вы отрицательные числа вместо правильных.
    Написано
  • Как найти кратчайший путь в лабиринте, двигаться в котором можно только вперед и направо?

    wataru
    @wataru Куратор тега C++
    Похоже, ук вас проблема с начальным состоянием. В очередь надо сложить 4 направления.

    И вообще, использование 3d массива считается нормой для такой задачи, или лучше стараться этого избегать и писать иначе?


    Ну, одно измерение тут всего 4. Так что не очень-то оно и трехмерное. Если у вас пространство вершин такое, то по-другому никак. Если так глаза мозилит, то можно завести массив фиксированного размера с максимальными размерами в задаче. Или вообще сделать массив одномерным и вычислять индексы руками.

    А в каких-нибудь задачах на DP иногда и 5-мерные массивы бывают.
    Написано
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Вы что-то напутали. S рекурсивно вычисляет сумму всех F() от p до q. Там же на каждом рекурсивном вызове прибавляется самое левое слагаемое.
    Написано
  • Какой алгоритм использовать, чтобы: разбить массив чисел так, чтобы суммарная разница между максимальным и минимальным числом была максимальна?

    wataru
    @wataru Куратор тега Алгоритмы
    BAF1, Попробуйте тест aaaaa 3 4
    Должно быть NO SOLUTION.

    А можно ли вывести всю строку, как одно слово? Вы, вроде как требуете всегда хотя бы 2 слова, но, может это и не надо? В тесте aaaaa 5 5 должно вывести одно слово aaaaa.
    Написано
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Алексей 〒., да, в этой задаче это особо не поможет.
    Написано
  • Какой алгоритм использовать, чтобы: разбить массив чисел так, чтобы суммарная разница между максимальным и минимальным числом была максимальна?

    wataru
    @wataru Куратор тега Алгоритмы
    Alexandroppolus,
    там может (r - l) сильно меньше n.


    Может. Но пока об этом ничего не сказано, оценка сверху остается O(n) на каждое f().

    что для вычисления max и min в очередной группе можно применить тот прием со стеком, который используется для вычисления оных на sliding window. Последняя группа смещается похожим образом. Если так, то будет вообще линейно.


    Ну не, это же только для фиксированного размера группы сработает. Если там хоть какой-то разброс есть r-l, то sliding window уже нe работает.
    Написано
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Alexandroppolus, да, ваша оценка более точна.
    Написано
  • Как оптимизировать код с++ с рекурсией в времени?

    wataru
    @wataru Куратор тега C++
    Adamos, Она вам задана рекурсивно. Если там не написано, что надо ее именно так написать в коде, то - нет.

    Если в задаче, например, сказано, что F(x) = sum i=1..x i, то функция заданна циклом. Но ее можно реализовать как x(x+1)/2.

    Если вам надо обязательно иметь в коде рекурсивную F, то никак особо вы код не с оптимизируете. S разверните в цикл - и все. Но этого, скорее всего, не хватит.
    Написано
  • Как в C++ создать массив с неизвестным числом элементов?

    wataru
    @wataru Куратор тега C++
    Вообще, некоторые компиляторы c++ поддерживают массивы переменной длины, и можно даже в коде написать:
    cin >> n;
    int a[n];


    Это называется VLA, и вообще идет из C, но оно не стандартно и не всегда и везде скомпилируется.
    Написано
  • Как переобразовать string в const unsigned char* в C++?

    wataru
    @wataru Куратор тега C++
    ASASDASDASDA, Только не забывайте, что это лишь указатель на память, которой владеет string. Поэтому если у вас str в примере выше выйдет из области жизни и удалится, то str_ptr останется висячим указателем.

    В какую-нибудь функцию системную, которой char* нужен (и он там не сохраняется после, допустим, вывода), на вот возвращать из функции и в глобальные переменные пихать - очень опасно.
    Написано
  • Как устроен вывод в задаче?

    wataru
    @wataru Куратор тега Алгоритмы
    Смотрите: вы добавляете в граф какие-то ребра. Надо чтобы после этого кратчайшие пути между заданными парами вершин укладывались в заданные ограничения. Ведь добавляя ребра вы можете какие-то пути улучшить (какие-то может и не улучшатся от каких-то ребер, но хуже нигде не станет. Ведь никто не заставляет пакеты ходить по новым ребрам).

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

    Ну, тест, например,
    7 6
    1 2 1
    2 3 1
    3 4 1
    4 5 1
    5 6 1
    6 7 1
    3
    1 4 2 1
    5 7 1 2
    1 7 1 3
    1
    1 7 4
    Вывод:
    2
    1 2
    Написано
  • Как устроен вывод в задаче?

    wataru
    @wataru Куратор тега Алгоритмы
    Sunter, Ну, время - путь в графе кратчайшей длины. В примере 2 добавив "1 3 1 3" вы создали путь из 1 в 3 длинной 3 (из одного нового ребра). Он укладывается в нужное ограничение.

    Добавление ребра "2 3 2 1" не помагает, потому что оно участвует в пути 1-2-3, и его стоимость 2+2 = 4, не укладывается в лимит по времени. Но добавить его в ответ все-равно можно, потому что цена добавления 1 меньше цены первого добавления. И кратчайший путь в графе (где длины ребер - время) все еще остается 3, через одно новое ребро 1-3.
    Написано