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

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

Всем привет!


На прошедшем туре Яндекс.Алгоритма случился вот такой инцидент: следующий код к задаче D взломался совершенно глупым простым тестом (50000 рэндомных add и потом 50000 sum подряд) - улетел по ВА. Однако потом в дорешивании этот же код получил ОК, попытки повторить ошибку не удались.

UPD: Чтобы не было придирок. Самое первое решение было неверно. Однако потом оно было исправлено, но все равно получило ВА, источник которого мне не ясен. Предложенный ниже код - это третья посылка по задаче, на мой взгляд - верная, но не прошедшая взлом.

Как по-вашему, код верный, и это какой-то глюк Codeforces, или вы сможете предложить тест, на котором он не работает (или хотя бы объяснить, почему он может работать неверно)?

Спасибо за помощь!

Собственно, вот сам код: http://pastebin.com/70w636Qb
  • Проголосовать: нравится
  • -5
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Решение очень идейно правильное.  Там  тебя кажется перетестировали

01:28:24  Решение взломано участником libe
01:42:55  Неправильный ответ на взлом 1 [взломы]  463338
01:53:25  Неправильный ответ на взлом 1 [взломы]  463714

Но не засчиталась последня попытка с неверным "if (p[i]<1 || p[i]>1000000000) while (true){};"


  • 14 лет назад, # ^ |
      Проголосовать: нравится -15 Проголосовать: не нравится
    Нет, мне интересна не последняя (косячная) попытка, а именно неверность исходного решения, которое было взломано, и почему последующие попытки (одну из которых я и выложил) тоже давали неверный ответ на взломе, а потом получили ок в дорешивании.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вижу.  Ты немного нас обманул ;) Во взломаном решение не было удаления повторяющихся. На этом и ломается.
  • 14 лет назад, # ^ |
      Проголосовать: нравится -15 Проголосовать: не нравится
    В первоначально взломанном - да, я обратного и не утверждал. Мне интересно - почему ВТОРАЯ и ТРЕТЬЯ попытки тоже получили ВА?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Точно. С этими двумя не понятно.
      • 14 лет назад, # ^ |
          Проголосовать: нравится -15 Проголосовать: не нравится
        Вот об этом и речь. Я код третьей выложил, где еще все ограничения на два умножены на всякий случай, потому что вообще не понимал, почему не заходило.
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Думаю в рандомном тесте были add c одним и тем же X без del между ними. и система его пропустила. 
  • 14 лет назад, # ^ |
      Проголосовать: нравится -15 Проголосовать: не нравится
    Вот у меня такое же предположение, а такой тест некорректен по условию. Но мне frost_nova прислал генератор на питоне и сказал, что вроде он такого генерить не должен.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Собсно, вот генератор:

    import random
    s = {}

    print 10**5
    for i in xrange(10**5/2):
     while True:
     x = random.randrange(1,10**9)
     if x not in s:
     break
     print 'add', x
     s[x] = True
    for i in xrange(10**5/2):
     print 'sum'
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Для любителей явы возможно будет интересно посмотреть код моей задачи D и попробовать понять почему она упала. Могу лишь сказать, что ошибка не в алгоритме и не в реализации дерева отрезков. Вдвойне обидно, что засабмитил я ее буквально на последних секундах.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Ну, тебе видно тест, на котором она упала, и ты ее уже вроде исправил. А у меня нет ни теста, ни понимания, почему она может не работать, злит также то, что все авторские тесты она прошла...
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я думаю имеет смысл обратиться к администрации и попросить показать тест на котором сломали решение.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это можно посмотреть самостоятельно. Нужно зайти опять в контест, вкладка "взломы" и там вы увидите все взломы вашего авторстка, а так же, как ломали именно вас, и там можно посмотреть тест.

        Есть только одна проблема... если он неполностью отображается
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Сделал. Пока безрезультатно.
  • 14 лет назад, # ^ |
    Rev. 5   Проголосовать: нравится +1 Проголосовать: не нравится
    all.get(i) != all.get(i - 1) ?

    • 14 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      оно...
      Вот за такие штуки хочется оторвать что-нибудь авторам явы. В шарпе этот момент сделан гораздо лучше.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А что, в яве в if (a || b) если a=true, то это еще не значит что b не будет исполняться?
        • 14 лет назад, # ^ |
            Проголосовать: нравится +8 Проголосовать: не нравится
          Значит
          Там проблема в том, что два Integer'а сравниваются как объекты
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            А отладить это нереально, т.к. эта штука еще и возвращает true, если числа равны и находятся в диапазоне от -128 до 127.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +41 Проголосовать: не нравится
        Любая нормальная IDE не только подсветит это, но и предложит самостоятельно исправить
14 лет назад, # |
  Проголосовать: нравится +18 Проголосовать: не нравится
Я выяснил в чем дело. Оказывается, в системе существует хитрый race condition при использовании недетерменированных генераторов. Он проявляется довольно редко и только на довольно больших файлах. Сделаю rejudge, goryinyich сможет принять участие в Round 2 в конкурсе.

goryinyich-у объявляется благодарность за бдительность, а мы приносим извинения за этот инцидент.

Ко второму раунду планируем сделать фикс, проверяющий генераторы на детерминированность последовательными запусками и сравнением их вывода.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Наверное, стоит дописать к правилам, что генератор обязан выдавать одинаковый результат при нескольких запусках.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А как тогда делать "большой случайный тест", например, если нужно завалить по времени?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я так понимаю это в любом случае будет реализовано(судя по написанному выше). А по поводу "большой случайный тест" - два варианта. Либо сделать его не случайным, а скажем там из чисел 1,2,3..n. Либо явно указать рандсид.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Либо , можно еще вычислять следующее число по какой-то сложной функции.
          • 14 лет назад, # ^ |
              Проголосовать: нравится +8 Проголосовать: не нравится
            Что и делает генератор случайных чисел. Рандсид просто явно указывает начальные данные
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    мдааа обидно venkateshb, из самого удачливого участника(200-ый), переметнулся в неудачника 201-го((...
    UPD: нет-нет, удача все ещё на его стороне=)
    • 14 лет назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится
      посмотрел бы список зарегистрированных сперва

      он в конкурсе ;)
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится

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

    UPD. отбой, теперь
    goryinyich в списке:)
    • 14 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      он вроде должен знать, Майк написал сообщение 4 часа назад, а последнее посещение кодфорсес goryinyich-ем было 3 часа назад, но конечно позвонить стоит...