Блог пользователя goo.gl_SsAhv

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

кто мне объяснит почему этот код получает AC на acm.timus.ru?

баг? я сначала парился с другой задачей, и мой ассерт не срабатывал,

поставил другое условие - отрицание предыдущего - всё равно не срабатывает. 

поставил ASS(0); перед считыванием данных - всё равно нету ожидаемого ТЛ.


вот решение 1000 на тимусе, почему оно заходит?

http://www.everfall.com/paste/id.php?wvxb294mu9qt

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

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Скорее всего, компилятор оптимизирует бесполезный цикл.
Однако, ассерт не должен по той же причине не работать. Код другой задачи в студию?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Оптимизация видимо. Попробуй сделать не void а int, возвращать 0 в конце ASS(int) и где то применить.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да, тле вызывает только то, что мы с возвращаемым значением что-нибудь поделаем дальше в программе.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Видимо реацкия также на изменение глобальных переменных в функции.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

не понял, вы считаете что тут я не прав, я не компилер ?

зачем же я буду извращаться под кривой компилятор и изобретать непонятно что.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Известны случаи когда вкладки типа while(1); в не вызываемом фрагменте программы изменяли вердикт с WA 42 на AC. Причем фокус работал с завидной стабильностью.

По сабжу: как сказали выше, оптимизатор убрал пустой цикл. Попробуйте делать какие-нибудь подсчеты в цикле, и результат этих подсчетов выводить после выполнения цикла.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится
    На самом деле там был не WA, а RE и вечный цикл был вставлен в место, которое теоретически никогда не должно было достигаться с целью того чтобы проверить, так ли это. Возможно код по другому расположился в памяти и утечка памяти, которая вызывала RE перестала валить программу.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      >.< Полный финиш
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Не ради холивара говорю, но, наверно, именно из-за таких интересных проявлений поведения кода на С++ многие выбирают Java для контестов.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Просто не надо такого писать. Чтобы такое поймать случайно, нужно оооооооооооочень постараться =) код на С++ подвержен всяким таким хитростям, но все они, как говорится, "от беса лукавого"(с) Не пишите такого - и будет вас щастье вселенское)

        Ну а вообще, если сравнить популярность Java и С++ в олимпиадном движении, то первый язык проигрывает со значительным отставанием... так что тут ты тоже не прав)
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ну не так уж сильно и надо стараться. Я на С++ в ACM писал не один год. Помню на UVA писал графовую задачу. На С++. Выделял памяти ровно столько, сколько было нужно для хранения максимального графа. К векторам обращался через []. Получал RE. Незначительно менял код и получал WA. И снова по кругу. Долго не мог понять, почему один раз RE, в другой - WA. И кажется на форуме вычитал, что в этой задаче неверные ограничения. Например, написано, что максимум 100 вершин в графе, а в тестах реально - 105. Видимо, народ экспериментально это определил. Выделил памяти больше и AC. 
          К чему это я? Да к тому, что в С++ порою существует тонкая грань между RE и его отсутствием. И зачастую это зависит от компилятора, его версии, платформы, на которой запускается решение и т.д. 
          Проблем хватает везде. Но, думаю, глупо отрицать, что в С++ существует тысяча и один способ выстрелить себе в ногу. :)
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Используй vector::at, будешь гарантированно получать исключение. :)
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Я не говорю, что их нет. Действительно, есть весьма нетривиальные моменты в С++, но если писать нормально, такого не будет. Не нужно обращаться в массиве к -1 элементу =)

            Если вы набажили - ну так бывает, но вобщем RE или WA - все равно задача не прошла. Все равно нужно искать ошибку.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Дествительно, в С++ очень много таких нюансов. Самый простой пример: если объявить подряд 2 массива одинакового типа (назовем их "ar" и "br") и обращаесь к элементу br[-1] мы обратимся к последнему элементу ar. Это у нас не вызовет RE, но может накидать мусор в другие переменные вызывая WA. С использованием же векторов у нас будет гарантировано RE.

          PS На расположение массивов в памяти, если мне мозг не изменяет, то влияет размерность массива. Компилятор делает адрес начала кратным 16.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А если убрать только лишь условие if (!b), то TLE.