Упътване

Тук е описано как работи системата и какво да очаквате, когато направите някое действие.
Версия на системата: v.180618.10d0bde

Съобщаване за проблеми

В менюто отдолу има линк "съобщи за проблем", чрез който регистрираните потребители могат да се свържат с админ и да съобщят за проблем (било то със системата или с някоя от задачите). Не се притеснявайте да го ползвате дори за малки проблеми като правописни грешки.

Предаване на решение

За да предадете решение, трябва да сте се регистрирали и влезли в системата. След като отворите някоя задача ще видите син бутон "Предай Решение". Цъкайки на него ще се отвори форма, в която да копирате кода си. За разлика от други системи, езикът ще бъде разпознат автоматично, така че остава единствено да натиснете "Изпрати" и решението ви ще бъде изпратено за тестване.

Статус кодове

След като сте изпратили решение е възможно системата да върне няколко различни статуса.
  • Waiting: Решението чака други предадени преди него решения да се изтестват.
  • Running: Решението се тества в момента.
  • Compilation Error: Решението не се е компилирало успешно.
  • Memory Limit: Решението е използвало повече памет, от допустимата за задачата.
  • Time Limit: Решението е вървяло повече време, от допустимото за задачата.
  • Runtime Error: Решението е крашнало по време на изпълнение (например в следствие на индексиране извън масив или делене на нула).
  • Wrong Answer: Решението е завършило изпълнението си успешно, но полученият от него отговор не е верен.
  • Internal Error: Нещо се е случило със системата по време на тестване. В този случай е препоръчително да известите админ чрез линка "съобщи за проблем" в менюто най-долу.
  • Accepted: Разбира се, в най-добрия случай предаденото решение е вярно и не е нарушило нито едно от ограниченията на задачата.
Заедно със статус кода ще получите и допълнителна информация - например на кой тест се е получена грешка или колко точки сте получили на всеки от тестовете. Информацията за всеки от Вашите събмити се пази на системата и може да бъде достъпена (само от вас) по всяко време през линка "Предишни решения" под условието на всяка задача.

Сравнение на числа с плаваща запетая

Системата имплементира сравнение на числа с плаваща запетая, базирано на абсолютна или релативна разлика. Това сравнение е такова, че да работи както за много малки, така и за много големи числа.

Често възникват проблеми, когато за сравнение се ползва само абсолютната разлика на числата. Например 1234567890.123456717 и 1234567890.123456955 имат разлика от 0.000000238 - малко над 10-7. При изисквана точност от 10-9 това би било грешен отговор. Ако пък ползваме точност от 10-6, например, то числа като 0.0000001 и 0.0000009 биха били счетени за еднакви, като всъщност разликата им е 9 пъти!

За да се справи с това, системата прави две проверки:
  1. Ако числата имат абсолютна разлика, по-малка от 10-9, отговорът се счита за верен (абсолютна разлика).
  2. Ако отношението на числата е много близо до 1 (попада в интервала [1-10-9, 1+10-9]), отговорът се счита за верен (релативна разлика).
Ако нито една от двете проверки не покаже, че отговорът е верен, решението се счита за грешно.

Компилатори и командни флагове

Изпратените решения се компилират ползвайки следните командни флагове:
  • C++ (GCC 5.4.0):
    g++ -O2 -std=c++14 -w -s -static -o <executable> <source>.cpp
  • Java (Oracle 1.8):
    javac -nowarn -d <executable> <source>.java
  • Python (Python 3.5.2):
    python3 -m pyflakes <source>.py
Максималното време за компилация е 10 секунди.
Максималният размер на стека е 64 мегабайта.

Тестова машина

Тестовата машина има следната хардуерна конфигурация:
  • Процесор: Core2 Quad :: 3.0GHz
  • Рам: DDR2 8GB :: 800MHz
  • Харддиск: Corsair Force SSD :: 520MB/s
Ползваната операционна система на тестовата машина е Ubuntu 16.04.

Опашка

Чрез бутона "Опашка" в главното меню можете да видите текущите решения, които системата все още не е обработила (както и последните няколко, които е обработила). Когато системата е по-натоварена (например по време на състезание) там е мястото да проверите кога вашето решение ще бъде тествано.

Подготовка

Цялата система беше създадена като средство за подготовка за различни състезания или курсове. Чрез бутона "Подготовка" в главното меню можете да стигнете до тематично разделени задачи в нарастваща сложност, застъпващи някои от най-разпространените теми в състезателната информатика. Минавайки през цялата подготовка ще Ви научи на мнозинството от основните алгоритми и структури данни, а също така ще Ви помогне да потренирате писането на по-сложен код, от това, което обикновено се застъпва в училище и университета.

Първите няколко секции от подготовката застъпват по-основните алгоритми и са подходящи както за ученици, готвещи се за състезания от по-долните класове (група D и нагоре), така и за студенти от университета или просто хора, които искат да се научат да пишат код.

Към края подготовката засяга значително по-сложни теми и включва съвсем нетривиални задачи (със сложност еквивалентна на задачи от републикански и международни състезания). Тя е по-скоро насочена към хората, подготвящи се за IOI или ACM ICPC.

Постижения

Всеки регистриран потребител може да "отключи" така наречените постижения. Това са важни събития в подготовката (и ползването на системата), като например регистрация, първо предадено решение, първа изцяло решена задача и много други (близо сто). Някои от тях са логични и очаквани (например завършването на дадена тема от подготовката), докато други са по-нестандартни и се присъждат на значително по-малък брой потребители. =)

Класиране и точки

Чрез бутона "Класиране" можете да достъпите текущо класиране на потребителите (както и да намерите линк към профила на всеки от тях). Класирането по подразбиране се прави на базата на точки, които потребителите събират решавайки задачи (по-трудни задачи носят повече точки), както и от постижения.

Системата предоставя възможност класирането да бъде подредено и по брой решени задачи или пък брой постижения.

Видове задачи

Системата поддържа няколко вида задачи:
  • IOI-стил: Тестовете са разделени на групи, като за всяка група има определен брой точки. В най-честия случай всеки тест е отделна група. За да се вземат точки за групата, решението трябва да се е справило с всички тестове в групата.
  • ACM-стил: За да се вземат точки за задачата, решението трябва да се е справило с всички тестове.
  • Релативна: За всеки тест се получават точки, пропорционално спрямо най-добрия резултат от всички участници за съответния тест.
  • Игра: Всеки тест е "игра" между двама (или всички) участници, предали решение на задачата.
Системата е направена да показва колко точки бихте получили в IOI-стил състезание, но класирането е все едно задачите са ACM-стил - една задача не се счита за решена, докато не минете всички тестове на нея!

Задачи с много валидни изходи

Някои от задачите нямат еднозначен отговор, като за тях е предвидено да се оценяват посредством checker. Това е друга програма (написана от автора на задачата), която чете изхода от програмата ви и решава дали е валиден или не (или колко точки да получи, за задачи с релативно оценяване).

В случай, че сте автор на задача и трябва да напишете чекер за нея, ето тук можете да намерите примерен чекер и инструкции какво се очаква той да прави: как да прочете входа на теста, изхода на участника, и изхода от авторското решение, както и как да изпечата резултата или пък да сигнализира за грешка.