Рад сообщить, что штаб Codeforces в лице Михаила Мирзаянова и Артёма Рахова поддержали идею добавления языка программирования C++0x, за что им огромное спасибо!
На данный момент, для компиляции решений на C++0x используется MinGW GCC 4.6.0. Для установки этой сборки MinGW достаточно распаковать архив, после чего нам сразу доступны 32- и 64-битные компиляторы g++.exe и x86_64-w64-mingw32-g++.exe, которые находятся в папке bin.
Для компиляции программ на C++0x, нужно указать ключ “–std=c++0x”, и в случае 32-битного компилятора дополнительный ключ -D__USE_MINGW_ANSI_STDIO=0 (иначе не будет работать printf для вещественных чисел, но об этом позже). Примеры строк компиляции:
«Путь к MinGW»\bin\g++ -std=c++0x solution.cpp –O2 -D__USE_MINGW_ANSI_STDIO=0
«Путь к MinGW»\bin\x86_64-w64-mingw32-g++ -std=c++0x solution.cpp –O2
Также можно поставить эту версию MinGW на среду разработки Dev-CPP, для этого достаточно скопировать содержимое папки MinGW в директорию с Dev-CPP с заменой существующих файлов, в самой IDE удалить все пути из “Tools\Compiler Options\Directories\{Libraries, C Includes, C++ Includes}” (рекомендую сделать резервную копию как файлов так и путей). Если Вы захотите использовать 64-битный компилятор, то нужно переименовать файл “x86_64-w64-mingw32-g++.exe” в “g++.exe”. Дополнительные ключи компиляции нужно указать в “Tools\Compiler Options\Add the following commands when calling compiler”.
Ввод/Вывод через scanf/printf.
Для работы с типом long long можно использовать спецификатор %lld. Ввод/Вывод чисел long double всё-ещё не поддерживается в этой версии MinGW. Также была замечена проблема вывода чисел double через спецификатор %lf в 32-битных приложениях, вместо вывода нужного числа, почему-то выводится 0.0000 или -0.0000. Проблема решается указанием ключа компиляции -D__USE_MINGW_ANSI_STDIO=0.
Замечу, что многие примеры из описания стандарта не компилируются, а некоторые примеры там и вовсе неправильные, поэтому перед использованием этого языка на контестах, рекомендую порешать несколько задач, чтобы ознакомится с реализованными в GCC 4.6 возможностями языка C++0x, о которых можно почитать тут.
UPD: На Codeforces был добавлен ключ -D__USE_MINGW_ANSI_STDIO=0, теперь функции scanf и printf работают точно так же как и на C++.
UPD: Обновлена инструкция по обновлению MinGW на Dev-CPP.
А почему бы не добавить на Codeforces поддержку C++0x ?
Q: А что это такое??
A: Это C++ из будущего в котором
не нужно ставить пробелы между символами > в темплейтах
| vector<vector<pair<int, int>>> v; |
можно удобно проинициализировать контейнер
| vector<int> a = {1, 2, 3}; |
не обязательно указывать тип переменной, если она явно проинициализирована
| for (auto i = a.begin(); i != a.end(); ++i) cout << *i << endl; |
есть лямбда выражения
| sort(a.begin(), a.end(), [](int x, int y) { return x > y; }); |
есть foreach (как в Java)
| for (int x : a) cout << x << endl; |
есть хеш-таблица
| unordered_map<int, string> f = { {1, "one"}, {2, "two"}, {3, "three"}, }; for (auto p : f) cout << p.first << " -> " << p.second << endl; |
и многое другое… но нет BigInteger’а :(
C++0x уже как-то поддерживается в GCC 4.3+, Microsoft C++ 2008+, IBM C++. А приведённые примеры компилятся (и работают!) на GCC 4.6. Для компиляции C++0x программ на GCC нужно указать ключ -std=c++0x.
Возможно, стандарт ещё не доработан и в полной мере его не реализует ни один компилятор, но писать контесты на нём (на свой страх и риск) хочется уже сейчас. Есть ещё желающие?
References
http://en.wikipedia.org/wiki/C++0x
Теоретически за взломы можно получить бесконечное количество балов, сценарий такой:
Участник А посылает решение, участник В ломает его, А посылает, В ломает, и т.д.…
Также участнику может быть впадлу решать задачи, он и так наберёт много балов за взломы, поэтому он сначала взламывает 20 решений, а потом просто стратегически обновляет страницу каждые 10 секунд, в ожидании неверных решений. В связи с этим, предлагаю сделать авто-обновление комнаты через AJAX.
Почему за задачи можно набрать 7500 балов, а за взломы оо? На мой взгляд, кажется логичным ограничить максимальное количество балов, которые может набрать участник за взломы. И по идее, это должно привести к более сбалансированным контестам.
Предлагаю стоимости взломов сделать убывающей последовательностью. К примеру, можно стоимость очередного взлома умножать на 0.9, если текущая стоимость взлома X, то в пределе можно наломать ещё 10X балов по задаче (умножать на 10 можно в уме, стратеги это оценят). Кстати, стимул взламывать будет, даже тогда, когда за взлом положено eps балов, ведь иначе балы достанутся конкурентам.
UPD: Убрал предложение которое уже частично реализовано.
Баг GNU C++ или мой?
Исходный код:
| #include <iostream> using namespace std; int main() { long long x = 1; for (; x > 0; x *= 10) cout << x << endl; return 0; } |
Вывод:
1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 100000000000 1000000000000 10000000000000 100000000000000 1000000000000000 10000000000000000 100000000000000000 1000000000000000000 -8446744073709551616 77662...
Ошибка выполнения [CRASHED] ===== Использовано: 0 мс, 0 Кб |
Локально воспроизвёл 64-битным компилятором g++ 4.5.2 (mingw-w64) с -O2.
После анализа ассемблерного кода выяснилось, что оптимизатор чёта забирает проверку x > 0. С точки зрения математики оптимизатор, наверное, прав. Он считает, что положительное число * 10 всё ещё положительное, поэтому проверку x > 0 программист написал зря, и на самом деле программист хотел бесконечный цикл.
Может я в очередной раз что-то напутал или выхожу за рамки стандарта?? Или действительно ‑8446744073709551616 > 0?







