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

Автор Sammarize, 13 лет назад, По-русски

334A - Пакетики с конфетами

В этой задаче требуется разделить все натуральные числа от 1 до n2 на n групп по n чисел в каждой так, чтобы суммы чисел во всех группах были одинаковыми.

Давайте разобьем все эти числа на пары . Это можно сделать благодаря тому, что n четное, а значит, и n2 тоже. Сумма каждой из этих пар равна n2 + 1. Теперь осталось только определить по пар в каждую из групп.

334B - Восьмиточечные наборы

В этой задаче требуется сделать лишь то, что сказано — определить, удовлетворяет ли данный набор из восьми точек описанному условию.

Есть множество способов это сделать. Например, следующий:

  1. Проверить, что среди координат этих точек есть ровно три различных x и ровно три различных y. Найти количество различных x (так же, как и y) можно, положив их в set и узнав его размер. Если оно не равно 3, вывести <>.

  2. Итак, у нас есть x1, x2 и x3, а так же y1, y2 и y3. Осталось проверить, что для любой пары (xi, yj) (кроме (x2, y2)) данная точка присутствует среди восьми перечисленных. Можно просто перебрать все эти пары и для каждой пары, перебрав все восемь точек, выяснить, есть ли эта пара.

Однако я думаю, что читать решение в данном случае — неблагодарная затея. Лучше просто посмотреть реализацию.

334C - Секреты / 333A - Секреты

На самом деле, в задаче разыскивается самая длинная такая последовательность натуральных чисел a1, a2, ..., ak, такая, что каждое число в ней является степенью тройки, сумма всех чисел больше, чем n, и если выкинуть любое из чисел, то сумма станет меньше n. Если точнее, требуется лишь узнать длину этой последовательности.

Рассмотрим минимальное ai = A. Поскольку все эти числя являются степенями 3, то все остальные ai делятся на A и, следовательно, сумма всех этих чисел S тоже делится на A. Если n также делится на A, то, так как S > n, то S превосходит n как минимум на A. Следовательно, если выкинуть из последовательности число A, то остаток будет не меньше, чем n, а это противоречит второму условию. Таким образом, мы выяснили, что n не делится ни на одно из чисел этого последовательности, даже на самое маленькое. Тогда найдем минимальное k такое, что — это легко сделать простым перебором. А дальше просто набрать минимальную сумму, превосходящую n монетами номинала 3k. Таким образом, ответом будет число .

334D - Фишки / 333B - Фишки

В этой задаче требовалось найти максимальное количество фишек, которые Геральд может поставить на поле.

Сначала сделаем два замечания.

  1. На каждую линию (вертикаль или горизонталь) можно поставить только одну фишку, с одного конца или с другого.
  2. Если на линии есть хотя бы одна запрещенная клетка, то на нее нельзя поставить ни одной фишки.

Соблюдая последнее замечание, мы избегнем попадания фишек на запрещенные клетки. Осталось избежать <<столкновения>> фишек.

Рассмотрим следующие четыре линии: вертикали i и n + 1 - i и горизонтали с теми же номерами (i может быть любым, если только i ≠ n + 1 - i). Заметим, что фишки, поставленные на эти линии, могут столкнуться друг с другом, но не могут столкнуться с фишками на других линиях. Таким образом, для этих четырех линий можно решать задачу независимо от других линий. Осталось заметить, что мы можем поставить фишки на каждую из этих линий (на которой не стоит запрещенная клетка), так, чтобы они не столкнулись так, как это показано на картинке.

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

334E - Счастливые билеты / 333C - Счастливые билеты

В это задаче надо предъявить нужное количество счастливых билетов.

Давайте рассмотрим, сколько разных чисел можно получить таким образом из четырёхзначных номеров. Их легко перебрать, благо их всего 104. Оказывается, что в среднем получается почти 60 чисел на каждый четырёхзначный номер. Пусть из номера n можно получить число x. Ясно, что k - x ≥ 0 либо x - k ≥ 0. Если, например, k - x ≥ 0, мы можем записать восьмизначный номер, в первых четырех цифрах которого будет записано k - x, а в последних четырех — n. Понятно, что такой билет будет k-счастливым. Всего это дает нам почти 600 000 билетов, этого вполне достаточно.

333D - Характеристики прямоугольников

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

Иными словами, надо найти максимальное значение величины min(ai1, j1, ai1, j2, ai2, j1, ai2, j2) при всех i1, i2, j1, j2 таких, что 1 ≤ i1, i2 ≤ n, 1 ≤ j1, j2 ≤ m, i1 ≠ i2, j1 ≠ j2. Давайте применим бинарный поиск по ответу. Для этого надо научиться находить, есть ли в таблице из 0 и 1 два столбца и две строки, на всех четырех пересечениях которых стоят единицы, то есть, такие i1, i2, j1, j2, что ai1, j1 = ai1, j2 = ai2, j1 = ai2, j2 = 1. Давайте рассмотрим все такие пары натуральных чисел (i1, i2), что существует натуральное число j такое, что ai1, j = ai2, j = 1. Наличие двух одинаковых таких пар как раз и означало бы наличие вышеописанных четырех чисел. Однако, всего может быть таких пар. Следовательно, мы можем завести массив, где будем отмечать, какие пары уже встретились и перебирать все пары в любом порядке, пока не встретится повторяющаяся пара или пока все пары не будут перебраны. Итого, получаем решение за время .

333E - Летний заработок

В этой задаче требуется нарисовать три непересекающихся круга максимального радиуса с центрами в заданных точках. Иными словами, нам надо найти треугольник у которого минимальная из сторон будет максимальна.

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

Вспомним факт из школьного курса геометрии, говорящий, что напротив большего угла лежит большая сторона. Кроме того, вспомним, что сумма углов в треугольнике равна . Из этого следует, во-первых, что как минимум один угол в треугольнике не меньше . Во-вторых, что этот угол не может быть самым маленьким в треугольнике. И следовательно, что напротив этого угла лежит не самая маленькая сторона. Следовательно, если в , то min(|AB|, |BC|, |CA|) = min(|AB|, |BC|).

Следовательно, мы можем поступить следующим образом. Переберем вершину B и найдем треугольник с максимальной минимальной стороной среди таких, у которых . Для этого отсортируем все остальные вершины по углу относительно B, и для каждой вершины A найдем самую удалённую от B вершину C среди отрезка тех вершин, для которых . Для этого нам понадобится использовать дерево отрезков для максимума и два указателя или бинарный поиск, чтобы хранить левую и правую границу возможных вершин C при переборе вершины A.

Итого, получаем решение за время .

Разбор задач Codeforces Round 194 (Div. 1)
Разбор задач Codeforces Round 194 (Div. 2)
  • Проголосовать: нравится
  • +44
  • Проголосовать: не нравится

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится

Третья задача — очень туго написано условие, я так и не понял, что нужно самую длинную последовательность: "чем надо сумму как можно меньшим количеством монет. Какое максимальное количество монет у него могло получиться?"

С одной стороны: как можно меньшим количеством монет, а с другой Какое максимальное количество монет у него могло получиться?

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Помогите, пожалуйста, найти ошибку в 333C - Счастливые билеты? Решение такое же, как в разборе 4186556, на домашнем компе работает, а на сервере переменные не хотят быть отрицательными при вычитании бОльших чисел...

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Вы обратили внимание, что в тесте просят три билетика, а Вы выводите много и большинство из них 12значные, хотя должны быть 8значные?

    • »
      »
      »
      13 лет назад, скрыть # ^ |
      Rev. 2  
      Проголосовать: нравится 0 Проголосовать: не нравится

      Конечно же да. На домашнем компе или на сервере с компилятором MSC++ 4185456 выводится 3 билетика, но там дальше возникают проблемы, теперь уже в 3-м тесте. UPD: Все, спасибо, мне помогли — проблемы была в обращении к массиву с отрицательными индексами.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +18 Проголосовать: не нравится

У меня в Е решение тоже за O(N2·logN), но как по мне — оно более простое.

Сделаем бинарный поиск по ответу r. После этого, переберем одну точку. Рассмотрим набор всех точек, которые отстоят от нее хотя бы на 2r. Если в этом множестве 2 самые удаленные точки лежат на расстоянии хотя бы 2r, то радиус r нам подходит, иначе — нет. Найти 2 самые удаленные точки можно за линейное время, при условии что мы уже построили их выпуклую оболочку. Заметим, что если мы предварительно отсортируем все точки по иксу, то выпуклую оболочку можно также построить за линейное время.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +5 Проголосовать: не нравится

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

У меня были какие-то мысли о потоках, но придумать не получилось.

  • »
    »
    13 лет назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Наверное, можно найти наибольшее независимое множество в графе, где вершины -- это граничные (но не угловые) клетки, и если поставить в две различные клетки по фишке, то если, они будут конфликтовать (т.е. пути фишек из этих клеток пересекаются), то ребро между соответствующими вершинами есть, иначе нет.

    UPD: Хотя, фиг его знает, какая там асимптотика.

  • »
    »
    13 лет назад, скрыть # ^ |
    Rev. 3  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Есть идея подсчитать для каждой фишки количество конфликтующих с ней фишек — то есть таких, которые нельзя будет поставить, если будет поставлена рассматриваемая фишка (таких вначале максимум 3, минимум 1).

    И после этого ставим фишки, пока можем. На каждом шаге выбираем фишку с минимальным кол-вом конфликтующих. Если таких несколько — ставим любую. Поставив фишку, помечаем конфликтующие с ней, что их уже тоже нельзя ставить и пересчитываем (уменьшаем) кол-во конфликтующих для "задетых" в результате этих манипуляций фишек.

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

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

I believe it's O(n^2 log max(a)) in D

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Using bitset in C++ STL, we can pass D and E :(

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +16 Проголосовать: не нравится

Using bitset in C++ STL, we can pass D and E :(

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    please can you write some details for these solutions

    • »
      »
      »
      13 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +3 Проголосовать: не нравится

      If we want to pass E An algorithm O(n^3):for circle i,j,k,we can check it and get answer. We know all distance of every pair,sort it If dis(i,j) is answer,dis(i,k)<=dis(i,j),mark[i][j]=true.I try each answer and they are sorted,so when I try dis(i,j),if mark[i][k]=true and mark[j][k]=true,we can print dis(i,j) If mark[i] is a bitset,and the k is exist,then (mark[i]&mark[j]).any() is not 0. We have an algorithm,O(n^3/32),and it can pass E Sorry for my English.In fact,my English is so poor that my teacher criticized me. T_T

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +30 Проголосовать: не нравится

Another way to solve E: first, binary search on the result r (complexity factor: ), then fix one vertex A of the triangle (complexity factor: n). We want to find two other vertices B, C such that all three distances are  ≥ 2r. Let's consider only the set S of those vertices that are farther than 2r from A. Now obviously, there are two vertices with dist(B, C) ≥ 2r if and only if the maximum distance of two points in S is  ≥ 2r. And this can be found using convex hull and rotating calipers (complexity factor: ).

(Actually, we need , not . But notice that the in convex hull comes from sorting the points. We can do that just once after reading the input. Then, after filtering out the too-close vertices, the list is still sorted.)

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +9 Проголосовать: не нравится

for problem Div1 D ,How this submission with complexity O(N^3) passed? 4183580

also how functions fastMax and fastMin work?

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

334C — SECRETS

for n=8 ... can not the buyer just give 9 mark coin ??

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

I can't understand D's solution. Can anybody explain more clearly?

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +8 Проголосовать: не нравится

for problem Div1 D ,will it take o(n) to find j so that ai1,j= ai2,j=1? when we meet repeated pair and return(4183297),how to compute the overall solution of time,why it's o(n^2 log(n))?

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Though it seems has O(N^3) iterations to find the two pairs, in every iteration it will find a new good pair(record it in a 2-d array good) or a repeated pair(thus find the two pairs and return). There are only O(N^2) states in 2-d array good, So it has at most O(N^2) iterations overall. Combined with binary search of answer, it gives O(N^2)log(n) algorithm. Codes 4192623

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится

I am very annoyed by the bad translation !

»
13 лет назад, скрыть # |
 
Проголосовать: нравится -9 Проголосовать: не нравится

Добрый вечер! Задача про "продажу секретов", условие некорректно. Согласно условию надо найти минимальное количество монет, которым можно собрать сумму выше требуемой. Ответ удовлетворяющий всем условиям задачи один для любых требуемых сумм, а именно 1 (одна) монета. С помощью одной монеты достоинством степень тройки выше требуемой суммы можно выплатить сумму большую требуемой. Причем в разборе еще указано одно условие, которого в задаче нет : типа если выкинуть монету, то сумма станет меньшей требуемой. Но даже в этом случае решение "одна моента" удовлетворяет этому условию, уберите ее, и сумма станет нулевой (что естественно меньше требуемой)

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +10 Проголосовать: не нравится

    Мы берем максимум по всем возможным конфигруациям таким, что ...

    Наличие комбинации с ответом 1 ничего не значит.

    • »
      »
      »
      13 лет назад, скрыть # ^ |
       
      Проголосовать: нравится -11 Проголосовать: не нравится

      Все возможные комбинации с суммой выше требуемой? Причем с целью уменьшить число монет? Предположим (условно) требуется сумма 90 мы можем выдать сумму 3^100, выше она требуемой? да, число монет минимально — да (одна монета). но мы можем выдать и монеты подругому. но в этом случае будет нарушена цель плательщика (выдать минимум монет) или я что то пропустил? Хорошо можно зайти с другой стороны, найти максимальное число монет, если включить в условие задачи требование "если выкинуть любую монету из набора, то сумма станет меньше требуемой" и убрать минимизацию со строны плательщика... но в условии есть минимизация но нет условия "выкинуть..."

      • »
        »
        »
        »
        13 лет назад, скрыть # ^ |
         
        Проголосовать: нравится +12 Проголосовать: не нравится

        Так-так-так-так-так. Давайте-ка прочитаем условие. "Тогда он постарался из имеющихся у него монет выдать Геральду большую, чем надо сумму как можно меньшим количеством монет". Из имеющихся у него монет. Он может выдать сумму больше, чем надо, одной монетой, только если она у него есть. А если, скажем, у него только монеты номиналом 27 и 81? Тогда ему придётся выдать две монеты 81 + 27 или 81 + 81. А в каких-то случаях ему придётся использовать ещё больше монет. Вот и спрашивается, какое максимальное количество монет ему придётся использовать.

        • »
          »
          »
          »
          »
          13 лет назад, скрыть # ^ |
           
          Проголосовать: нравится 0 Проголосовать: не нравится

          На самом деле условие действительно мутноватое. Но там еще есть последний абзац, который все объясняет.

          В единственной строке выведите целое число: максимальное число монет, которым мог расплатиться незадачливый покупатель.

          Спасибо за контест)

        • »
          »
          »
          »
          »
          13 лет назад, скрыть # ^ |
           
          Проголосовать: нравится 0 Проголосовать: не нравится

          В условии задачи нет данных, которые указывали, какие монеты есть, а каких нет. Из этого следует что у его есть любые монеты. Максимальное число монет, которой можно выдать сумму больше нужной равно бесконечности, поскольку ограничения на сумму накладываются. Например при цене секрета в 1 марку, что в условиях задачи мешает заплатить миллион? А десять? А сто? Так что минимум набора — одна монета, максимум — бесконечность...

          • »
            »
            »
            »
            »
            »
            13 лет назад, скрыть # ^ |
             
            Проголосовать: нравится 0 Проголосовать: не нравится

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

          • »
            »
            »
            »
            »
            »
            13 лет назад, скрыть # ^ |
             
            Проголосовать: нравится 0 Проголосовать: не нравится

            Во-первых, это продолжение естественной ситуации, которая была описана в условии — к Геральду приходит человек, чтобы купить секрет, у него в кармане есть какие-то деньги, но не все деньги государства, конечно. Именно поэтому вполне может оказаться, что у него не найдётся нужная сумма без сдачи. Если не опираться на ситуацию, описанную в условии — то зачем она вообще? Дали бы сухую математическую формулировку. Можно было и так сделать, но раз дали живую легенду, то не просто так, а для того, чтобы опираться на неё при понимании условия.

            Во-вторых, написано же — " из имеющихся у него монет". Это ясно указывает, что речь идёт не он всевозможных монетах, а только о тех, которые у него есть. А раз об этом идёт речь — значит, это не одно и то же.

            В третьих, да, в условии нет данных, которые указывали, какие монеты есть, а каких — нет. Но это указывает не на то, что него есть любые монеты, а на то, что у него любые монеты могут быть, с таким же успехом, как и не быть.

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +12 Проголосовать: не нравится

    Неправда ваша, перечитайте условие.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Can someone please explain the logic behind Div2 C problem ? I am not able to understand the tutorial.

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +8 Проголосовать: не нравится

    Ok. We see from statement, that we are looking for the longest possible sequence a1, a2... ak with these properties:

    • all numbers ai are powers of three -- we only know coins with these values

    • sum S of these numbers is larger than n -- we must pay larger amount of marks, because buyer doesn't have exact amount

    • if we remove any element from sequence, the sum of remaining elements will be smaller than n -- buyer doesn't have exact amount and want to pay larger amount with minimum number of coins possible

    Now denote minimal ai as A. Other ai are larger or equal, so these number are multiples of A. If S is sum of all elements ai and each element is divided by A, than S is also diveded by A.

    Now let's consider, that n is diveded by A. We know, that S is multiple of A, n is multiple of A and S is larger than n. So S - n ≥ A which means, that n ≥ S - A. But this is contradiction with last property of our sequence. So n cannot be divided by minimal ai in our sequence.

    Last thing is, that if we want the longest sequence, all numbers should be equal. This is pretty obvious, because if A is minimal element, than any larger element is multiple of A and can be distributed to more A elements.

    Now you can iterate through all k such as 3k ≤ n. If 3k doesn't divided n, than you can obtain answer . And the biggest such number is final answer. If n is power of three, then answer is 1.

    My code here: 4175901

    I hope, this will help.

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +32 Проголосовать: не нравится

I've got similar solution for problem Div1-D, but I don't use binary search. Complexity of my solution is still , but in my opinion it's easier to implement.

So the main idea is the same. Consider pair of columns (c1, c2). Two such pairs in different rows (r1, r2) creates one possible solution -- rectangle with characteristic min(ar1, c1, ar2, c1, ar1, c2, ar2, c2). And we want the largest characteristic.

We sort all numbers in rectangle from the biggest to the smallest. Now we will add these number in this order. When we add element ai, j it creates pair of columns with every element on row i, which are greater (or equal and were added before). So we store these elements in vector (one for each row) and iterate them. During this we count, how many times we see which pair of columns. When we see some pair the second time, we have possible solution and because we add elements from biggest one, it's also the largest rectangle. So value of the last added element is answer.

Time complexity: we need time time for sort all numbers. Then we add each pair of columns at most once, so the complexity is O(n2). Overall it's .

Here is my code: 4183958

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Поясните, пожалуйста, решение задачи Div1 D. Никак не могу понять, как за квадрат можно проверить существование двух одинаковых пар (i1,i2) и двух различных j, им соответствующих. Больше всего не понимаю фразу "перебирать пары в любом порядке, пока не встретится повтор". Кроме того, в моем понимании, наличие двух одинаковых пар (i1,i2) не говорит о наличии четырех единиц в углах: j может быть одинаковое у них.

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +13 Проголосовать: не нравится

    Для каждой строки выпишем все номера стобиков, в которых находятся числа, большие либо равные текущему значению, которое мы перебираем бинпоиском. В лоб переберем все пары таких столбиков. Если такая пара когда либо встречалась — то это однозначно происходило в одной из прошлых строк. Если такое повторение есть — прямоугольник существует. Иначе же, мы переберем не более O(N2) пар, потому что их всего O(N2)

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +88 Проголосовать: не нравится

I'm sorry but after reading this editorial I'd a feeling like this

»
13 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится

Learn a lot from your solution of 333E - Summer Earnings. thx. :D

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Кто знает подскажите пожалуйста. Задача "Счастливые билеты" ошибка wrong answer Line [name=current number] equals to "", doesn't correspond to pattern "[0-9]{8,8}" на тесте 15, но все ответы совпадают с шаблоном, в каких ещё случаях эта ошибка может вылетать?

  • »
    »
    13 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

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

»
13 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

In E, we can avoid implementing segment tree and use a deque to maintain maximum on interval that is being held by two pointers (check this submission 4213091).