Задать вопрос
  • Сдвиг двумерного массива, появление ошибки Stack around the variable 'arr' was corrupted. Как исправить без переписывания кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Код исправляется элементарно. Надо внутренний цикл по j гнать не до 0, а до 1. Что бы не вылезать за границу массива, вы же там к j-1 -ому элементу обращаетесь. А поскольку вы делаете swap, то вы меняете элементы массива с памятью перед ним. Массив - локальная переменая, а значит он лежит на стеке и вот это вот затирание памяти рядом с массивом и есть это самое "Stack around the variable 'arr' was corrupted".

    Ну и по стилю - вместо i > -1 обычно пишут i >= 0.
    Ответ написан
    Комментировать
  • Как решить задачу с символами? Почему не работает одна функция?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам надо не делать break. А сохранить куда-то текущее значения счетчика kol и также установить флаг, что вы встретили u. После цикла, который заканчивается чтением точки, надо, если флаг u был не встречен, вернуть значение счетчика kol. Иначе - сохраненное значение.

    Ваш первый вариант работал бы сразу, если бы вы сначала читали всю строчку в память и циклом по ней проходились. Но, поскольку надо всю строку всегда прочитать, то break ломает работу функции.
    Ответ написан
    3 комментария
  • Как дописывать число в файл со сложением через base64?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вместо числа пишите в файл строку. Строку получайте прогоняя число через какую-то библиотеку с base64 функцией.
    Ответ написан
    Комментировать
  • Как записать значение в файл и зашифровать его на языке C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Открывайте файл в бинарном режиме "wb" и пишите туда через fwrite (лучше побайтово, чтобы не мучиться с переносимостью из-за порядком байтов в int).

    Читайте, соответственно, через fread.

    Для шифрования лучше всего, во-первых, байты в разном порядке писать, (не 0,1,2,3, а, скажем, 2,0,3,1) и, во-вторых, xor-ить их с какими-то константами. А еще лучше не с константами, а со случайными данными, которые тоже записываются в файл рядом. Или не рядом, так будет закономерность меньше видна.

    Но все это может спасти только от людей незнакомых с reverse engineering'ом и отладкой. Более менее осведомленный ползователь посмотрит в ассемблерный код и поймет, что и как там читается и где и что надо поменять. Но да, это посложнее просто редактирования txt файла.

    Ну и, artmoney с cheat engine никто не отменял.
    Ответ написан
    Комментировать
  • Алгоритм максимально равномерного распределения предметов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    std::vector<int> DistributeExtraObjectsFairly(std::vector<int> objects, int extra_objects) {
        std::vector<int> permutation;
        permutation.reserve(objects.size()+1);
        permutation.resize(objects.size());
        std::iota(permutation.begin(), permutation.end(), 0);
        std::sort(permutation.begin(), permutation.end(),
            [&objects](const int &a, const int &b) {return objects[a] < objects[b];});
        int num_increased = 1;
        permutation.push_back(0);
        int step = (objects[permutation[num_increased]] - objects[permutation[num_increased-1]]) * num_increased;
        while (extra_objects >= step && num_increased < objects.size()) {
            extra_objects -= step;
            ++num_increased;
            step = (objects[permutation[num_increased]] - objects[permutation[num_increased-1]]) * num_increased; 
        }
        int final_value = objects[permutation[num_increased-1]] + extra_objects / num_increased;
        int num_bigger_values = extra_objects % num_increased;
        for (int i = 0; i < num_bigger_values; ++i) {
            objects[permutation[i]] = final_value + 1;
        }
        for (int i = num_bigger_values; i < num_increased; ++i) {
            objects[permutation[i]] = final_value;
        }
        return objects;
    }


    Идея: отсортировать числа и добавлять к минимальному, пока оно не станет равно следующему. Потом добавлять к двум мнимальным. Потом к трем и т.д. Вместо добавления к каждому числу индивидуально по одному объекту считаем, сколько надо объектов чтобы первые несколько первых стали равны следующему. Когда нашли, что дальше не приравнять - распределяем остаток среди затронутых элементов по-ровну, остатки кидая куда-то.

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

    Edit: работает за O(n log n), где n - количество элементов в списке. Быстрее, я подозреваю, никак. Есть еще решение за O(n log M) - где М - максимально возможное число во входных данных. Это через бинпоиск по минимальному числу в конце.
    Ответ написан
    Комментировать
  • Почему при вызове деструктора не меняется переменная?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Я так понимаю, у вас проблема со строчкой
    aobj1[0] = a(2);

    Тут вызывается конструктор для временного значения a. Потом оператор копирования из временной переменной в *aobj. Потом вызывается деструктор временного значения.

    А потом где-то в конце произойдет и деструктор aobj.

    У aobj delete_counter после этой строчки равен 1 (ведь он скопирован у временного значения, которое сделало delete_counter единицей в констукторе). В конце при вызове деструктора aobj там delete_counter будет 1 в начале.

    Вы смотрите на адрес this в дебагере в деструкторе. Два вызваных деструктора будут для двух разных объектов (для временного значения и для aobj).

    Если вы хотите какой-то счетчик ссылок делать, то вам надо переопределять операторы копирования и перемещения (а так же все возможные конструкторы). И там аккуратно изменять счетчик ссылок. И счетчик ссылок должен быть частью общего объекта - частью класса b, а не класса a.
    Ответ написан
    4 комментария
  • Почему простой цикл на c++ выполняется медленнее, чем на golang?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы сами в комментариях привели дизассемблированный код. Go по какой-то причине оптимизирует код лучше - тупо выкидывает весь ваш цикл.

    Чтобы этого не было, можно ксорить не с константой, а с индексом i, например.
    Ответ написан
    Комментировать
  • Как объявить функцию в другой функции?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо использовать forward declaration.

    Перед F напишите
    int G(int n);

    Это скажет компилятору, что есть вот такая функция. Ее определение же остается также дальше по тексту после F.
    Ответ написан
    Комментировать
  • Как избежать дублирования последней строки из файла?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вам надо проверять, что вернет fscanf. Если оно у вас вернет что-то меньшее 2, то значит оно не смогло прочитать обе строки. В этом случае надо выходить из цикла и не класть новую запись в таблицу
    Ответ написан
    Комментировать
  • Путь коня или какова польза ограничений?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Есть простая оптимизация - из всех возможных ходов из текущей клетки перебирать сначала те, которые ведут в клетку с наименьшим количеством возможных следующих ходов (это надо проверить и все ходы через один ход и посмотреть, а обойдены ли те клетки уже). Эта оптимизация как раз заставит коня ходить сначала вокруг стенки и по спирали подходить к центру.
    Ответ написан
    5 комментариев
  • Есть ли смысл в уточнении типов данных чисел? И что это даст?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Может в этом быть смысл, только если у вас большой длинный массив, и вы его тип уменьшаете. К скорости прибавки почти не будет - в основном из-за локальности данных только. Ну съедите поменьше памяти - это да.

    Оптимизировать же переменные смысла нет никакого. Сэкономите пару байт буквально.
    Ответ написан
    Комментировать
  • Алгоритм двоичного поиска. Почему неправильно работает алгоритм?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Знаки в условиях перепутаны.
    Ответ написан
    Комментировать
  • Как сделать чтобы нейросеть поняла входные данные?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы сети скармливаете какие-то 2 картинки. У нее 2 input'а

    print(model.predict([image,image2]))

    Втавьте вот в этот код выше перед вызовом predict вывод размеров image и image2.

    Сдается мне, что вы одну картинку как-то на 2 куска порезали и так и скормили сети. Если это не ваш код, то он возможно ожидает на вход картинку 128x64.
    Ответ написан
  • У меня несколько ошибок "was not declared in this scope" в коде C++, что делать?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Глобальные переменные должны быть определены выше фкнкций их использующих. А что-то, например buff, у вас вообще локальные переменные, которые вы пытаетесь использовать в других функциях. Или сделайте и ее глобальной, или передавайте ее везде, где надо, как параметр.

    И так по каждой ошибке от компилятора в вашем вопросе. Смотрите на какое имя он ругается и где эта функция/переменная определена.
    Ответ написан
    1 комментарий
  • Как правильно применить абстрактный класc здесь?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Пометьте все методы DVector(2) в Vector2.h override. Посмотрите на ошибки компилятора.
    Ответ написан
    4 комментария
  • Реализация обоюдного включения файлов проекта?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо чтобы не было циклических зависимостей. Подумайте над структурой проекта - вынесите какие-то функции в отдельные файлы, которые уже будут включатся и в файле формы и в основном файле, если надо.

    В особо запущенных случаях придется какие-то функции или классы дробить.

    Ну и Include guard'ы используйте
    Ответ написан
    Комментировать
  • Как оптимизировать код?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Как обычно в вопросах про олимпиадные задачи, ответ тут - код не соптимизировать никак. Надо его переписать с нуля с более быстрым алгоритмом.

    Смотрите на ограничания - n и m до 100000. Обычно такой порядок чисел означает, что вам нужно решение за O(n+m) или что-то вроде O(n+m log (n+m)). У вас же решение "в лоб" за O(nm), что никак не ускорить принципиально. Даже переписыванием на си со всякими хитростями вы ускорите его в 10, ну в 100 раз. А вам надо ускорить его в 10000 раз.

    Могу дать подсказки:
    Во-первых, если и там и там есть положительные элементы, то взяв максимальные в двух массивах вы точно получите элемент больше всех a и b. То же, если и там и там есть отрицательные элементы - надо взять два минимальных.

    Остался случай - что если один массив целиком отрицателен, а второй - целиком положителен. Пусть a положителен, а b отрицателен. Что будет, если взять минимальные по модулю элементы и там и там? Посмотрите внимательно - вам дано, что ни одно из чисел не 0. Это поможет.
    Ответ написан
  • Почему не работает с char[]?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В коде какой-то ошибки не вижу. Скорее всего вы уже пытаетесь эту структуру засунуть в EEPROM и из-за этого что-то не работает.

    Это же c++, судя по тегам? Сделайте тогда все поля структуры static const и не заводите ее экземпляр. Обращайтесь к константам так: MqttConfig::host. Константы обычно задают так, а не значениями по умолчанию полей структуры.

    А скорее всего, ошибка вообще не тут. Вы что-то напутали где-то. Может, в коде опечатка и порт не тот в структуре указан. Или что-то еще. Соберите работающую программу, выведите аккуратно все параметры. И так же выведите все параметры в неработающей программе со структурой. И выведите все коды ошибок всех функций, что бы точно знать, какая из них ломается.
    Ответ написан
    Комментировать
  • Ошибка не соответствует ожиданию, почему?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В родительском классе у вас DVector(2P), а в наследнике DVector(2).

    Несовподают типы, об этом вам компилятор и говорит.
    Ответ написан
  • Можете решать эту задачу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Можно забить на добавление вершин. Поскольку в задаче нет команд "удалить вершину" и гаранитируется, что в каждый момент времени структура будет деревом, то можно просто сначала создать дерево из всех вершин, и потом в нем выполнить все LCA.

    Воспользуйтесь алгоритмом тарьяна: https://e-maxx.ru/algo/lca_linear_offline для получения ответов на все запросы LCA сразу.

    Сначала при вводе создайте дерево целиком и запомните все запросы Get в массив. Потом пройдитесь по массиву запросов и раскидайте их в списки на вершинах, как надо в алгоритме таръяна.

    Вам надо лишь чуть-чуть подкорректировать этот код, чтобы вместе с вершиной-запросом добавлять в списки к вершинам номер этого запроса. И тогда вместо вывода v+1, q[v][i]+1 вы сможете записать ответ в массив по нужному индексу.

    Ну или воспользуйтесь онлайн алгоритмом для поиска LCA через обход со временем входа/выхода и деревом отрезков на минимимум.
    Ответ написан
    Комментировать