Rizvanov's blog

By Rizvanov13 months ago, translation, In English

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.

Read more »

 
 
 
 
  • Vote: I like it  
  • +21
  • Vote: I do not like it  

By Rizvanov13 months ago, In Russian

А почему бы не добавить на 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

http://www2.research.att.com/~bs/C++0xFAQ.html

http://gcc.gnu.org/projects/cxx0x.html.

Read more »

 
 
 
 
  • Vote: I like it  
  • +98
  • Vote: I do not like it  

By Rizvanov14 months ago, In Russian

Теоретически за взломы можно получить бесконечное количество балов, сценарий такой:

Участник А посылает решение, участник В ломает его, А посылает, В ломает, и т.д.…

Также участнику может быть впадлу решать задачи, он и так наберёт много балов за взломы, поэтому он сначала взламывает 20 решений, а потом просто стратегически обновляет страницу каждые 10 секунд, в ожидании неверных решений. В связи с этим, предлагаю сделать авто-обновление комнаты через AJAX. 

Почему за задачи можно набрать 7500 балов, а за взломы оо? На мой взгляд, кажется логичным ограничить максимальное количество балов, которые может набрать участник за взломы. И по идее, это должно привести к более сбалансированным контестам.

Предлагаю стоимости взломов сделать убывающей последовательностью. К примеру, можно стоимость очередного взлома умножать на 0.9, если текущая стоимость взлома X, то в пределе можно наломать ещё 10X балов по задаче (умножать на 10 можно в уме, стратеги это оценят). Кстати, стимул взламывать будет, даже тогда, когда за взлом положено eps балов, ведь иначе балы достанутся конкурентам.

UPD: Убрал предложение которое уже частично реализовано.

Read more »

 
 
 
 
  • Vote: I like it  
  • +1
  • Vote: I do not like it  

By Rizvanov16 months ago, In Russian

Баг 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?
UPD: Как выяснилось, никакого бага в GCC нет (и никогда не будет! будут новые стандарты)
Поэтому пока не поздно перейду на MS C++, так как это уже второй раз как решение падает на GNU C++, после чего тоже самое решение проходит на MS C++. А я почему-то подумал, что местный компилятор GCC стрёмный и неадекватно оптимизирует код, в других местах ведь всё работает. Но увы, подобным поведением страдает не только местный компилятор, но и все достаточно новые версии GCC (начиная с 4-ой), а в других местах просто нет двух компиляторов С++ и тесты нельзя смотреть.

Read more »

 
 
 
 
  • Vote: I like it  
  • +34
  • Vote: I do not like it