CodeChef invites you to participate in the November CookOff 2013 at http://www.codechef.com/COOK40.
Time: 17th November 2013 (2130 hrs) to 18th November 2013 (0000 hrs). (Indian Standard Time — +5:30 GMT) — Check your timezone.
Details: http://www.codechef.com/COOK40/
Registration: Just need to have a CodeChef user id to participate.
New users please register here
- Problem Setter : Vineet Paliwal
- Problem Tester and Russian Translator : Roman Rubanenko
- Editorialist : ShangJingbo
- Mandarin Translator : xiaodao
It promises to deliver on an interesting set of algorithmic problems with something for all.
The contest is open for all and those, who are interested, are requested to have a CodeChef userid, in order to participate.
Trees and Subtrees как-то детерминировано решается?
Такой вопрос — это google translate меня обманывает, или в оригинальном условии действительно нигде четко не указано, что M — это всегда лево, а E — это всегда право? Сделал первый сабмит для случая, когда сыновей можно переставлять местами, получил WA, случайно прочел русский вариант условия — удивился.
И еще, это как-то неспортивно, что условие на русском так ощутимо отличается от оригинала. И вообще заметно проще для восприятия, без легенды. Получается, что у меня преимущество относительно какого-нибудь китайца, потому что он должен раскуривать сказку, а у меня перед глазами сразу четко сформулированная задача в терминах графов.
На каждый запрос можно отвечать за O(n). Когда пришел запрос — будем проверять все поддеревья того же размера, что и дерево в запросе. Проверять поддерево будем втупую проходясь по нему целиком. Понятно, что каждая вершина будет принадлежать не более, чем одному из таких поддеревьев.
При данных ограничениях O(nq) — это 2·107, что должно спокойно проходить.
Я не знаю как то условие переводить, чтобы оно было читаемое и понимаемое. Кстати, переводчик на китайский тоже был назначен, но в последний момент куда-то пропал :)
Вообще говоря, про то, что нельзя переставлять местами сыновей, можно было в силу того, что иначе непонятно, зачем эти метки на ребрах. Хотя, конечно же, условия ужасные были. Есть информация, что этот автор не будет впредь допущен к подготовке контестов, по крайней мере ланчей и куков.
Решается и за NlogN очень просто. Если под недетерминированным решением имеются в виду хеши, то детерминированное решение пишется проще них. Сделаем обход в глубину и каждой вершине присвоим класс эквивалентности поддерева. Для этого будем хранить глобальную мапу из тройки (age, класс левого ребенка, класс правого ребенка) в класс. Если какого-то ребенка нет, будем для удобства считать, что его класс -1. В обходе найдя классы двух детей, посмотрим, есть ли тройка в мапе, и если нет — создадим. Обойдем исходное дерево, получим заполненную мапу. Теперь с той же мапой обойдем каждое дерево-запрос, но запретим добавлять в нее новые элементы. Если захотелось добавить новый элемент, вываливаемся и отвечаем на запрос "нет".
The editorials can be found here: http://discuss.codechef.com/tags/cook40