Задать вопрос
  • Как работают переменные в низкоуровневом понятии?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Тут много уровней.

    Самое простое - компилятор запоминает, что вот myvar - это переменная, которая лежит вот там-то в памяти. Грубо говоря, эти все имена переменных - это псевдонимы для адресов памяти. Если он видит в коде myvar = a + 1;, то он генерирует инструкцию, которая читает из фиксированного адреса переменной a, прибавляет 1 и сохраняет результат в адрес для переменной myvar.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Правильный ответ - ни так и не эдак. Никак. Сравнивать указатели не из одного и того же массива - undefined behavior. Это было недавно в статье на хабре. Там ссылаются на раздел 3.3.8, "Relational operators".

    Более того, у вас там в программе еще UB: нельзя обращаться к данным в переменной long через указатель short - Это нарушение strict aliasing.

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

    На практике - никаких лево и право там не существует, есть только младшие и старшие адреса, читайте про big/little endian порядки байт. Они там бывают и так и эдак в разных архитектурах. В x86, например, младший байт имеет меньший адрес.
    Ответ написан
    Комментировать
  • Как узнать расстояние между вершинами в дереве?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно получить список всех потоков одного процесса через Thread32First/Thread32Next (пример).

    Ищется в гугле буквально по "winapi list threads".
    Ответ написан
    Комментировать
  • Почему не читаются данные при вводе из файла?

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

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

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

    Там можно искать нужный вам элемент через floor или ceiling. Поиск и удаление, если создатели библиотеки в java хоть что-то слышали про алгоритмы и структуры данных, работают за логарифм.
    Ответ написан
    Комментировать
  • Чему будет равна сложность этого алгоритма?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Зависит от размеров item. Если они там каждый O(N) размера, то ваша догадка правильная: O(n^2 log n).

    Если же все item суммарно не превосходят N, то ответ O(N log N). Потому что если их размеры a_i, то у вас сумма ai log ai. log(ai) можно сверху ограничить log(N) и вынести за скобки и потом заменить сумму в скобках на N.
    Ответ написан
    1 комментарий
  • Как найти максимально похожий цвет?

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

    Если надо работать очень быстро, то надо представить ваши именные цвета как точки в трехмерном пространстве, построить kd-дерево или r-дерево и уже в нем искать ближайшую к запрошенной точку.
    Ответ написан
    5 комментариев
  • Как написать функцию расшифровки этого алгоритма?

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

    Шифрование делает 34567890 итераций, вам надо сделать столько же. Внутри порядок операций надо развернуть, чтобы отмены выполнялись в обратном порядке. Если в строке 2 операции, например умножение и вычитание, то сначала надо выполнить обратное к вычитанию и только потом обратное к умножению.

    Обратные к вычитанию и сложению - сложение и вычитание соответственно. Если шифрование прибавляет 12345, то вам надо 12345 вычитать в дешифраторе. Побитовое исключающее ИЛИ обратно само себе, ведь если его применить 2 раза, то получится исходное число.

    С умножением все гораздо сложнее. Я предполагаю, что тип state - unsigned int. Если он знаковый, то умножение с переполнением - это undefined behavior вообще. В безнаковых целых умножение с переполнением есть просто умножение и взятие по модулую 2^32. Т.е вам нужно найти операцию, обратную умножению по модулю 2^32.

    Это будет умножение на обратное по модулю.

    Для его нахождения вам надо будет использовать расширенный алгоритм эвклида (в статье по ссылке выше оно расписано). Его можно или реализовать отдельно для нахождения обратных к 31663 (и другим множителям). Или можно его руками на бумажке прогнать.

    Отдельно вам надо разобратсья с отрицательным множителем. Вам надо найти положительный множитель, который будет давать точно такой же результат шифрования. Подсказка.

    Edit, только заметил в вопросе, что state - двубайтовый. Значит, все происходит по модулю 2^16.
    Ответ написан
    9 комментариев
  • Как перебрать все суммы массива?

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

    Перебирите все битовые маски (числа) от 0 до 2^n -1 (mask = 0; mask < (1 << n); ++mask).

    А внутри при подсчете суммы пройдитесь по всем позициям массива и, если i-ый бит установлен, прибавляйте текущее число. Проверить, что бит установлен можно сделав побитовое и (&) c 1 << i.

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

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

    Проверить, что что-то не так можно через векторное произведение последовательных сторон.

    Для всех 3 подряд идущих вершин a, b и c, то надо проверить, что (b-a)*(c-b) всегда дает одинаковый знак (или всегда <=0 или всегда >=0). Это векторное произведение.
    Формула в вашем случае будет (xb-xa)*(yc-yb)-(xc-xb)*(yb-ya).

    Еще можно построить выпуклую оболочку (convex hull).
    Вот расписан алгоритм, как ее построить по заданным точкам: https://e-maxx.ru/algo/convex_hull_graham

    Edit: Еще можно, вместо сортировки точек в выпуклую оболочку, игнорировать клики от пользователя, которые делают текущий многоугольник невыпуклым. Опять же, проверку невыпуколсти можно делать только для новых сторон: В последней, новой и первой точках.
    Ответ написан
    2 комментария
  • В чем моя ошибка в задаче?

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

    Но вот случай, когда достаточно одного числа вы неправильно разобрали. Почему вы ищите самое большое простое число? Какой вообще смысл смотреть, что в позиции ans-1 стоит c?

    А еще ваш код выводит 0 неверно иногда.

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

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

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

    Построение матрицы менять не надо, оно просто считает оптимальную длину LCS. Вам надо отдавать приоритет переходам вверх (или влево) пока это возможно при восстановлении ответа.

    Но можно сделать простой хак - усеките ваш текст как можно короче, пока LCS все еще оптимального размера.

    Вам надо найти самое первое максимальное число в последней строке (или столбце, в зависимости от того в какой из входных строчек вы хотите как можно левее найти вхождение. Я не в курсе, что у вас за aCompareFunc).

    От этой позиции и запускайте ваш DoDiff вместо левой нижней ячейки матрицы.

    Значения максимума даже не надо искать, он будет в левом нижнем углу матрицы. Вам остается только циклом найти самое левое число в строке (столбце) равное последнему.

    Вам еще придется в конце зарепортить необходимое количество l3diffDeleted или l3diffAdded, чтобы восстановить усеченную часть.
    Ответ написан
    1 комментарий
  • Как тут применить китайскую теорему об остатках?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Найдите остаток от деления искомой штуки на 4 и на 25. Далее примените китайскую теорему об остатках.

    Так проще, потому что остаток от деления a^(b^c) на степень простого числа можно найти по малой теореме Эйлера:

    a^(b^c) = a ^ (b^c % (p-1)p^(n-1)) mod p^k.

    Т.е. 7^9^9 = 7^((9^9) % 20) mod 25

    9^9 % 20 уже можно вычеслить через логарифмическое возведение в степень.

    Аналогично для 4.

    Правда, тут можно и без теоремы об остатках. Надо просто сразу применить теорему ейлера. фи(100) надо только аккуратно вычислить. И числа будут чуть больше, но все-равно подъемные.
    Ответ написан
    Комментировать
  • Как "нормально" перевести float в int?

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

    Edit: Видимо, проблема в том, что 0.9 нельзя идеально точно представить в float. На самом деле там хранится что-то вроде 0.8999999.... При домножении на 10 и округлении вниз вы получите 8, а не 9.

    Надо использовать округление к ближайшему - round.
    Ответ написан
    1 комментарий
  • Как в двоичном дереве поиска найти минимальный элемент, больший данного?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Надо, как в бинарном поиске - идти или в левое или в правое поддерево. Если пошли в левое поддерево, то надо проверить, что вернула рекурсивная функция - если там не было больших элементов, то надо вернуть значение в текущей вершине.
    Ответ написан
    3 комментария
  • Как к html странице подключить css на своем Http-Серевере?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если стили не встроены прямо в html файл, то css - это просто ресурс на сервере, как и html страница, как картинки или js скрипты. Браузер сам делает запрос по адресу, прописанному в Html теге на странице. Сервер должен лишь отдавать правильый mime type у файла.
    Ответ написан
  • Как расширить массив с++ (добавить элемент)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Используйте std::vector. Он автоматически расширяется и при этом работает быстро.
    Ответ написан