Блог пользователя Rizvanov

Автор Rizvanov13 месяцев назад, По-русски

Рад сообщить, что штаб 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.

Полный текст »

 
 
 
 
  • Проголосовать: нравится  
  • +21
  • Проголосовать: не нравится  

Автор Rizvanov13 месяцев назад, По-русски

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

Полный текст »

 
 
 
 
  • Проголосовать: нравится  
  • +98
  • Проголосовать: не нравится  

Автор Rizvanov14 месяцев назад, По-русски

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

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

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

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

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

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

Полный текст »

 
 
 
 
  • Проголосовать: нравится  
  • +1
  • Проголосовать: не нравится  

Автор Rizvanov16 месяцев назад, По-русски

Баг 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-ой), а в других местах просто нет двух компиляторов С++ и тесты нельзя смотреть.

Полный текст »

 
 
 
 
  • Проголосовать: нравится  
  • +34
  • Проголосовать: не нравится