Блог пользователя Vasya.V

Автор Vasya.V, 14 лет назад, По-русски
Контест получился интересным, без засилья геометрических задач. Расстроила кривизна чекера в задаче С.
H сдал после контеста алгоритмом с асимптотикой O(n * log(n) + 50 * n * f), где f - сложность поиска в хеш-таблице. Пришлось использовать IO через fread / fwrite (scanf / putchar ловили TL). Никто больше не сталкивался с подобной проблемой?
  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
что делать в H когда мы не можем однозначно определить время войны?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Считать все участки времени, где возможно военное время, как тру. Там же написано:
    "На i-й позиции должна стоять единица, если i суток назад туземцы могли воевать."
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    В общем, делал так.

    Клал в hashtable тройки чисел - записи туземцев.

    for(i = 0; i < N; i++)

       for (j = i + 49; j > i; j--)

          if ((a[j], a[i], j - i + 1) in hashtable)

             красим отрезок [i, j]

             break;


    покраска делается с помощью дерева отрезков. break нужен, чтобы не красить лишнее (улучшает аспимтотику)


    • 14 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      Тоже самое но без hashtable, а с бинпоиском по массиву, и красим в лоб (там же всего 50 ячеек красить, мы и так перед этим делаем довольно трудоемкие запросы, так что от этого хуже не будет). AC за 0.75.
      • 14 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        50 элементов - это классно! Когда рассуждения дошли до слова "покрасить", мозг перестал думать, а руки начали вбивать дерево :)

        А с IO не было проблем?

        UPD. По-видимому, именно покраска через дерево, а не напрямую давала TL со стандартным IO

        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Никаких. Сдал не с первого раза, так как не проверял, что j<n (если смотреть по твоему коду).
        • 14 лет назад, # ^ |
            Проголосовать: нравится +6 Проголосовать: не нравится

          дерево там не нужно, мы красим в один цвет

          z[start]++, z[end + 1]--

          int cur = 0;

          for (int i = 0; i < n; i++) {

          cur += z[i];

          s[i] = cur > 0 ? '1' : '0';
          }

    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      У меня на джаве решение прошло, когда я вместо HashMap<Pair> стал использовать HashMap<Long>
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Я занял 59 место с 6 задачами и кучей штрафа.
Я тоже 2 часа пихал C из-за чекера (+19). Жаль, что так вышло.
Еще задача D расстроила своей непонятностью, с 3 попытки я угадал, что они от меня хотят.
Расскажите, как нормально решать задачу G? Как некоторые писали ее за 5 минут? Я на последнем часу сумасшедшую фигню запихал.
И было бы неплохо вообще почитать какой-нибудь разбор...
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    как показал сегодняшний контест +19 - мелочи жизни по сравнению с +87



  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    G - простая динамка.
    	int n;
    	int a[113];
    	cin>>n;
    	for (int i=0;i<n;i++){
    		cin>>a[i];
    	}
    	sort(a,a+n);
    	int b[113];
    	b[n-1]=0;
    	b[n-2]=a[n-1]+a[0];
    	for (int i=n-3;i>=0;i--){
    		b[i]=min(b[i+1]+a[i+1]+a[0],b[i+2]+a[i+2]+2*a[1]+a[0]);
    	}
    	cout<<b[1]+a[1];
    UPD. Правда, обоснования не знаю :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да там и жадность проходит.
    • 14 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
      А, ну это вроде бы и есть мое решение, только тут в 20 раз меньше кода и оно за O(N), а не за квадрат :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        У нас в этом учебном году на районной олимпиаде школьников была эта задача с n=105. Было приятно её увидеть на тимусе:)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    Решал жадностью

    Рассмотрим 2 стратегии:

    1) Проводить каждого участника с самым быстрым (т.е быстрый ведет кого-то, потом возвращается, и т.д)

    2) Проведем 2х быстрых, вернем второго. Проведем 2х самых медленных, вернем быстрого.

    Теперь непосредственно решение - это выбрать момент перехода со 2 стратегии на первую

14 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Контест очень нестандартный. Плохо отрешался - сдал 7 задач. Не сдал простую задачу I. Придумав правильное решение, я умудрился неправильно забить формулы.
В таблице вообще картина интересная: мой сокомандник Вячеслав Алипов решил тоже 7 задач, но общих у нас только 5 задач. Вот оно подтверждение того, что каждый из нас в команде идет в плюс :)
Я сдал менее решаемую задачу E. Я ее сдал, как задачу о доминантном покрытии. Написал кучу оптимайзов - удаление ядерных строк, удаление ядерных столбцов, удаление поглощающих строк и кучу других отсечений. Инетересно, а как еще можно было ее решить?
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Мой сокомандник туда затолкал генетику (Это я про задачу E).
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Пытался сдать эту задачу на первом часу с rand() (так когда-то давно сдал задачку о наименьшем покрытии). Это была большая ошибка :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
У меня в задаче H зашло с первого раза самое наглое решение с set<pair<pair<int,int>,int>> (0.859 sec.), ввод обычным scanf. O(n*z*log(m)), где z - максимальное из данных нам d.
Хотелось бы узнать "честное" решение задачи E, т.е. без отсечения по времени и всяких волшебных констант в коде. Было бы неплохо с обоснованием :) Сам же загнал в ней "нечестное" решение.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Думаю, это и есть честное решение, ведь не зря же в условии z < 50.
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    тоже самое но без отсечений и на хешмапе вместо set<pair<int, int> > 
    upd:
    бежим сначала по длине (до 50 максимум)
    {
    чистим хешмапу, кидаем туда все конфликты,
    потом бежим по массиву  исмотрим есть ли в мапе искомый конфликт.
    }
    50 * (n + m) 140 мс
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Господа, вопрос стоит по задаче E :) А вы мне про H.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    по слухам авторское решение Е переборное с отсечениями
    интересно как китаец сдал ее на 13 минуте, то есть через 9 минут после А
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да, авторское решение - аккуратный перебор с отсечениями.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Основная идея авторского решения (как я понял) такая:

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

      Я закодил эту идею. Без всяких отсечений это АС за 0.031. В перебор я передавал маску покрытых городов, город который хочу покрыть, число уже выбранных городов и маску выбранных городов (для сохранения ответа). 66 строк.

      Работает быстро, потому что граф лежит на плоскости. Нестрогое объяснение: как бы худший случай, это когда все города, которые нас могут покрыть, находятся на расстоянии ровно R. Но таких городов максимум 6. Если же города ближе чем R, то тогда городов для выбора много. Но! Тогда выбранный город накрывает сразу много других городов. 

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        С таким же интуитивным доказательством я и запихал перебор за O(2N). Ну тут ничего другого и не придумаешь. NP-полная задача, но с неориентированным планарным графом в основе - она может вполне быть решена любым перебором. Я придумал еще несколько хитрых отсечений, которые вполне могли приблизить количество состояний перебора к тому, что у авторского решения, но кодить их не хотелось, да и, слава Богу, не пришлось :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Да, C расстроила чекером.
А из 10 представленных задач 8 было в Вологде.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    да, в С написали меня автором, но поменяли условие и взяли свой чекер, который сравнивал ответы как строки(
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Угу, в Вологде то у меня (по моей неведомой глупости) со второго раза зашла и ни у кого круче чем +5 и -9 не было.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Так вот как ты сдал G за 5 минут! Читер!
    • 14 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
      G такой боянище. 
      Оригинально (на контестах по программированию) была на каком-то европейском полуфинале начала века вроде
    • 14 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
      Ага. Я на онсайте сдал через полтора часа только потому что недоумевал А как так 17 то? о_О

      Как надоумил - сразу заслал.
      До этого 2 или три раза её видел.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А что за прикол был в D?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Там если и числитель, и знаменатель равны нулю, надо вывести undefined
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Смотря что считать приколом, я тупо заифила. Внимательно смотрим формулу и расписываем.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А есть какие-нибудь особые свойства у графов, получающихся в задаче E? Или вообще любой граф можно сконструировать подобным образом?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я конечно понимаю что уже поздно но где можно было писать этот контест если не секрет?
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

ignore


14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Как решается I?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Если раскрыть скобки получаем, что нам надо найти минимум многочлена второй степени от 2 переменных (а точнее точку, где достигается минимум). Для этого надо найти точку, где производная по обеим переменным - 0. Она находится решением системы 2 линейных уравнений
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Правильно ли я понимаю, что эти переменные - начальная точка прогрессии и разность членов?

      Тогда вроде надо найти 2 частных производных, приравнять их к 0 и решить СЛУ?

  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Она решается методом наименьших квадратов, в чистом виде. Задача тоже в некоторой степени боянистой получилась.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
          Баянистая - это очень мягко сказано.  Данный вариант метода наименьших квадратов (многочленами первой степени) изучают даже экономисты.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Я сначала заметил, что в первом примере суммы всех членов в данной прогрессии и в приближении совпадают и подумал, что это всегда верно. Никаких других закономерностей не заметилось, поэтому решил написать тернарный поиск по первому элементу. Но wa 6 =( Потом просто загуглил метод наименьших квадратов и вбил формулы.