Доброго времени суток, читатель.
Немного из того как я решал сотый раунд.
Началось с того, что я решил задачу А... скажем, за нормальное время (АС на 9 минуте).
Открыв задачу B и посмотрев на монитор, решил что её я буду решать позже. Прочитал задачу С и сразу подумал, что её следует решать с использованием какой-то структурки, наподобие priority_queue. Естественно я по-быстрому написал решение с stl-ной структурой priority_queue. Когда моё решение нормально отработало на тестах из условия, я сразу захотел потестить на большом примере. Естественно выбрал тест n=100000, а комы по одной штуке с размерами от 1 до 100000. Запускаю и... происходит что-то неладное... моё решение работает ооочень долго. Даже на похожем тесте, но с n=10000 моё решение работает около 8 секунд. Далее я подумал, может я не всё знаю о priority_queue и сделал тот же алгоритм, только с map. Результат оказался тем же. Ещё чуть погемороился и забил на эту задачу.
Перешёл к задаче D. Уважаемая Наталья, я честно не представляю, как можно сразу не увидеть здесь тупой сорт и пробег по массиву. Мне кажется это самое очевидное решение, и как можно убедиться, правильное. Вобщем я ещё несколько минут пытался придумать что-то плохое в этом решении, ибо не верил своим глазам, что эта задача имеет номер D. Ничего плохого не увидел, закодил и сдал. Мне кажется, эта задача должна была иметь номер A.
Так. После я прочитал эту ужасную задачу B. Не, задача то может и неплохая, но блин пока её поймёшь, вобщем страх. С полной кашей в голове я её еле-еле понял и сдал.
Вернулся к С... Вобщем получилось так, что эта лажа, которая будет описана ниже, выбила меня из колеи и я потерял кучу времени, так и не сдав правильное решение, которое на мой взгляд должно было заTLиться. А ведь были шансы...
Так вот. Мне кажется это когда-то обсуждали и связано это с режимом запуска, т.е. релиз или дебуг, но всё-таки ничего не понятно. Моё решение по задаче С у меня на компе долго работало. У меня стоит VS2010Pro. Моё решение практически идентично вот этому решению http://codeforces.me/contest/140/submission/999273 . И давайте будем опираться на него. Итак, если поменять строку (scanf("%d",&n);) на (n=100000;) а (scanf("%d",&x);) на (x=i+1;) то получится, что при запуске на сервере она работает 170 мс. Если же запустить у себя на компе, то работает такая программа невообразимо долго... Причём работает оочень долго уже на вот этом цикле
for (map<int,int>::iterator it = a.begin(); it != a.end(); ++it){
q.push(PII(it->second,it->first));
}
Вопрос: почему так происходит с длительностью работы и как правильно узнать время работы программы, кроме как запуск на сервере?
Сортишь начальный массив по убыванию. Дальше заводишь массив mid-размера - снеговики. Сначала кладешь самые большие куски на нижний уровень, затем итератором ищешь средние куски - смещаешь номер снеговика, если попался кусок отличный по размерам от того который уже лежит внизу(легко доказать что это оптимально). Точно так же ищешь мелких.
Попробуй тут выбрать Release и запустить по Ctrl+F5.
UPD. Но вообще для console debug наверное будет очень хорошо.
Ну а под compile mode debug компилируется без -O2, поэтому и тормоза.
Ясное дело, что под релизом скорость тестить. :)
Думаю к студии придираться сложно.
Вот такой вот опыт, который, возможно, стоил футболки...
Под системным отладчиком само по себе решение работает ровно столько же. И на Тимусе, кстати, запускается тоже под отладчиком. Проблема в том, что в этом режиме работает более медленный алгоритм освобождения памяти, поэтому может проходить значительное время между выполнением "return 0" и завершением программы. Лечится это изменением какого-то из флагов (вроде "Disable heap coalesce on free") утилитой gflags.exe ( http://technet.microsoft.com/en-us/library/cc738763(WS.10).aspx )
/*UPD. Ну и такая же конструкция для delete[]*/
В папку, куда установлен Vim :) И на винде он вроде бы называется: "_vimrc"
UPD: Там уже должен лежать, думаю
Второе ваше утверждение - какая-то трава, что значит "каждому отдельному вектору не хватает памяти"? Или вы думаете, что если одному вектору из массива её не хватает, перевыделяться будет весь массив? Откуда вообще вектору знать, что он в каком-то массиве? Разумеется, перевыделяется только один вектор (в памяти они хранятся не подряд, если что).
UPD: Лямбда-функция? В моём C++?
Нет, в последней версии CDT 8.0 дебаггер очень даже неплохой. Он конечно не сравнится с VS, но если привыкнуть, отлаживать программу становится легко.
UPD: а в QT Creator можно спокойно просмотреть содержимое вектора?
Ошибочка вышла, не знал.