Если вы написали несколько задач и подготовили для них тесты, вероятно, вы будете крайне неприятно себя чувствовать, если какие-то из тестов окажутся некорректными (в том смысле, что они не будут согласованы с условием задачи): значение какой-то величины будет больше допустимой верхней границы для нее, граф не будет удовлетворять требованиям связности или же не будет являться деревом... Это естественно, что вы будете себя так чувствовать. Даже опытные авторы задач не застрахованы от ошибок (это случается даже на самых престижных соревнованиях: пример тому — финал чемпионата мира ACM ICPC 2007 г.)
Настоятельно рекомендуется писать специальную программу (называемую валидатором), чтобы формально проверить каждый тест на соответствие всем требованиям условия задачи. Валидаторы обязательны для задач, которые готовятся для Codeforces. Polygon имеет встроенную поддержку валидаторов.
Написать валидатор с помощью testlib.h на самом деле очень легко.
Пример
Ниже приводится валидатор, который мог бы быть написан для задачи 100541A - Stock Market:
#include "testlib.h"
int main(int argc, char* argv[]) {
registerValidation(argc, argv);
int testCount = inf.readInt(1, 10, "testCount");
inf.readEoln();
for (int i = 0; i < testCount; i++) {
setTestCase(i + 1);
int n = inf.readInt(1, 100, "n");
inf.readSpace();
inf.readInt(1, 1'000'000, "w");
inf.readEoln();
inf.readInts(n, 1, 1000, "p");
inf.readEoln();
}
inf.readEof();
}
Оригинальный валидатор, использующий более старые версии testlib.h#include "testlib.h"
int main(int argc, char* argv[]) {
registerValidation(argc, argv);
int testCount = inf.readInt(1, 10, "testCount");
inf.readEoln();
for (int i = 0; i < testCount; i++) {
int n = inf.readInt(1, 100, "n");
inf.readSpace();
inf.readInt(1, 1000000, "w");
inf.readEoln();
for(int i = 0; i < n; ++i) {
inf.readInt(1, 1000, "p_i");
if (i < n-1)
inf.readSpace();
}
inf.readEoln();
}
inf.readEof();
}
Самое замечательное в этом валидаторе то, что он очень простой, и в нем очень трудно написать что-то неправильно.
В репозитории Github можно найти другие примеры валидаторов.
Функции и методы
Первая строка вашего кода должна содержать вызов registerValidation(argc, argv): немного магии, и вы можете использовать необходимые методы.