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

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

Всем привет!


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

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

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

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

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

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

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

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


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

Думаю в рандомном тесте были add c одним и тем же X без del между ними. и система его пропустила. 
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится -15 Проголосовать: не нравится
    Вот у меня такое же предположение, а такой тест некорректен по условию. Но мне frost_nova прислал генератор на питоне и сказал, что вроде он такого генерить не должен.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 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'
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Для любителей явы возможно будет интересно посмотреть код моей задачи D и попробовать понять почему она упала. Могу лишь сказать, что ошибка не в алгоритме и не в реализации дерева отрезков. Вдвойне обидно, что засабмитил я ее буквально на последних секундах.
15 лет назад, скрыть # |
 
Проголосовать: нравится +18 Проголосовать: не нравится
Я выяснил в чем дело. Оказывается, в системе существует хитрый race condition при использовании недетерменированных генераторов. Он проявляется довольно редко и только на довольно больших файлах. Сделаю rejudge, goryinyich сможет принять участие в Round 2 в конкурсе.

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

Ко второму раунду планируем сделать фикс, проверяющий генераторы на детерминированность последовательными запусками и сравнением их вывода.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +5 Проголосовать: не нравится
    Наверное, стоит дописать к правилам, что генератор обязан выдавать одинаковый результат при нескольких запусках.
  • 15 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

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

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

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

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