Блог пользователя VladKov

Автор VladKov, история, 4 года назад, По-русски

Здравствуйте. Сегодня, 5 января, прошел первый тур областной олимпиады Республики Казахстан для 11 класса по информатике. Все уже поучаствовали, условия задач появились на оффициальном сайте (кто не верит — https://daryn.kz/olympiads/view/4/2982, вторая ссылка на ЯД, В скачанном архиве еще один архив информатика, там условия), а значит никто не может их дорешать. Поэтому предлагаю обсудить решение третьей, последней задачи C. Для удобства ниже представлено условие. (Также интересуют подходы к частичным решениям, пусть даже и очевидные, например, дп по маске к первой подзадаче)

  • Проголосовать: нравится
  • +24
  • Проголосовать: не нравится

»
4 года назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

Здесь можно дорешивать клик.

»
4 года назад, # |
Rev. 6   Проголосовать: нравится +14 Проголосовать: не нравится

Рассмотрим все непустые подмножества, их $$$2^N-1$$$. Так как условия "$$$x$$$ входит в подмножество" и "$$$x$$$ не входит в подмножество" противоположные, то можно найти, сколько есть подмножеств, в которые $$$x$$$ входит, а затем вычесть их из количества всех подмножеств.

Так как побитовый AND меньше либо равен своим аргументам, то $$$x$$$ — минимум в подмножестве. Пусть $$$x=100101011010$$$ в двоичном представлении, тогда в подмножество, в котором будет $$$x$$$, мы можем включить любые элементы, которые не испортят побитовое AND, то есть, те числа, у которых те биты, которые равны $$$1$$$ в $$$x$$$, равны $$$1$$$ и в них. То есть, в данном случае, к $$$x$$$ мы можем добавить любые элементы, удовлетворяющие шаблону $$$1??1?1?11?1?$$$, где $$$?$$$ означает, что на этом месте может стоять любой бит.

Теперь, если выполнить инверсию над элементами массива, то эта задача сведется к стандартной sum over subsets: на примере того же $$$x$$$ шаблон превратится в $$$011010100101$$$, где $$$1$$$ — любой бит, $$$0$$$ — строго нулевой, а значит, подойдет любое число, множество единичных битов которого является подмножеством единичных битов шаблона.

Первым делом посчитаем динамику по подмножествам: для каждой битовой маски сколько есть чисел, множество единичных битов которых является подмножеством единичных битов данной маски.

После того, как мы эти количества посчитали, мы можем, наконец, перебрать все минимумы $$$x$$$ и для каждого минимума сказать, сколько подмножеств мы можем с ним составить, комбинаторно. код.

»
4 года назад, # |
Rev. 3   Проголосовать: нравится +6 Проголосовать: не нравится

К полному решению, предложенному выше, могу добавить следующее:

Для 3 подзадачи динамку можно считать для каждого элемента массива отдельно, просто перебрав все подмаски элемента и инкрементируя соответсвующее значение в динамике. Асимптотика $$$O(2^{10}\cdot n)$$$.

Для решения 4 подзадачи можно подсчитать количество вхождений каждого элемента, а затем перебрать все маски и их подмаски (e-maxx). Асимптотика $$$O(3^{15} + n)$$$