Обнаружил не так давно одну интересную проблему с компилятором Microsoft Visual C++ 2010.
Посылка № 4997092 на "acm.timus.ru" от 2 июня 2013 по задаче 1542 получает "Wrong Answer" на первом тесте на компиляторе Visual C++ 2010 и получает Accepted на всех версиях G++.
Я попытался выяснить, в чем проблема. В решении был фрагмент кода:
...
for (int i=1; i<=k; i++) {
sch[i] = find_max(a,b);
update(sch[i], -1);
}
...
где функции find_max() и update() — для работы с деревом максимумов. С таким фрагментом — "Wrong Answer 1" (на Visual C++ 2010).
Однако! Если добавить никогда не выполняющийся "if" или просто сделать какое-либо действие с sch[i], то получается "Accepted":
...
for (int i=1; i<=k; i++) {
sch[i] = find_max(a,b);
if (sch[i] < 0)
printf("ha-ha-ha"); // if никогда не выполнится (а если бы выполнился,
// то тогда всё равно WA должно быть, а не AC)
update(sch[i], -1);
}
...
См. посылку № 4997093 от того же числа.
Как это объяснить? В голову приходит только мысль о том, что оптимизатор Microsoft Visual C++ 2010 просто подсчитал один раз значение функции find_max(a,b) и использовал в дальнейшем его, не вызывая функцию на последующих итерациях цикла, что является неверным, т.к. find_max(a,b) использует дерево tree, изменяющееся в вызовах update(sch[i], -1).
Может быть, есть возможность изменить параметры компиляции, чтобы такого не происходило?
Примечание 1: в ключах компиляции стоит 2-й уровень оптимизации, даже не 3-й. Вроде бы не должно тогда такого происходить.
Примечание 2: на Codeforces такая ошибка тоже проявляется.
Скорее всего, undefined behavior где-то в коде. Такая конструкция довольно часто используется. Я думаю в случае проблем с оптимизатором уже бы заметили раньше.
Вам прислать код с сэмплами?
Пришлите=)
Проще выложить в открытом доступе. Вряд ли кто-то будет отсылать ваш код, чтобы получить +1 задачу на тимусе.
Как проще всего в таком случае выложить код в открытый доступ? Не A+B problem всё-таки.
Прямо сюда, в обсуждения?
Ну да. Не настолько это великая задача все-таки, чтобы так скрывать ее. Тем более людям будет проще сразу видеть код, чем выпрашивать его у вас (да и кому это нужно).
Залейте на 10 мин или на час на pastebin.com .
Исходный тест:
Правильный ответ:
Ок, код программы:
Спрячьте, пожалуйста, под спойлер.
Да, вы правы, функция find_max(a,b) почему-то выполняется только 1 раз.