I am glad to inform that the staff Codeforces namely Michael Mirzayanov and Artem Rakhov have supported the idea of adding C++0x programming language, many thanks to them for this!
At present MinGW GCC 4.6.0 is used for compiling C++0x programs. For setting up this assembly just unpack the archive, and then you can use 32- and 64-bit compilers g++.exe and x86_64-w64-mingw32-g++.exe respectively from folder bin.
To compile C++0x programs, you have to specify the command-line parameter "-std=C++0x", in the case of 32-bit compiler add the parameter -D__USE_MINGW_ANSI_STDIO=0 (otherwise printf doesn’t work with doubles). Example command-lines:
"MinGW path"\bin\g++ -std=c++0x solution.cpp –O2 -D__USE_MINGW_ANSI_STDIO=0
"MinGW path"\bin\x86_64-w64-mingw32-g++ -std=c++0x solution.cpp –O2
In case if you would like to use MinGW with Dev-CPP IDE, just copy & replace the content of the folder MinGW to Dev-CPP folder and remove all paths from “Tools\Compiler Options\Directories\{Libraries, C Includes, C++ Includes}” in IDE (I recommend making a backup copy of files and paths). If you want to use 64-bit compiler, rename the file "x86_64-w64-mingw32-g++.exe" to "g++.exe". Also you should provide command-line parameters to IDE in Tools\Compiler Options\Add the following commands when calling compiler.
Input/Output with scanf/printf.
This MinGW still doesn’t support types long long and long double, use cin and cout for dealing with them. Also problem has appeared with printfing doubles via %lf in 32-bit applications, instead of displaying the required number, for some reason appears 0.0000 or -0.0000. To solve the problem you should specify the command-line parameter -D__USE_MINGW_ANSI_STDIO=0.
Keep in the mind that many examples from C++0x standard description don’t work on GCC 4.6, as well as some examples contains mistakes, so before using this language on contests I recommend to solve several tasks to get acquainted with C++0x features implemented in GCC 4.6.
UPD: The command-line parameter -D__USE_MINGW_ANSI_STDIO=0 was added on Codeforces, and now functions scanf and printf work the same as in C++.
UPD: Instruction of updating MinGW in Dev-CPP was updated.
А почему бы не добавить на 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?







