https://www.spoj.pl/problems/DAGCNT2
Please anyone give me some hint about the proper algorithm to solve it. My solution run in O(n^2) (and got TLE) @@.
Please anyone give me some hint about the proper algorithm to solve it. My solution run in O(n^2) (and got TLE) @@.
ok, but how to get answer without counting the same vertex twice?
BTW: your comment in russian interface, so and my too
А запихивал кто-то? Ничего умнее n*n+n*m/32 не придумывается. Локально за секунду работает, но это же spoj :/
Там вроде быстрее n*n+n*m/64 и нет ничего. Но непонятно как пихать.
мда.. уже через 10 мин. -1
ладно, просто делаем массив булей v. когда встречаем вершину проверяем значение v[i] и если оказалось, что false - меняем на true и прибавляем вес вершины к сумме.
+: а тут то за что?
Запихнул: http://pastie.org/3244846
У меня более крутое решение в плане асимптотики, у тебя присутствует явный квадрат n, у меня n * m / 32 + n / 32 (3 * 2 ^11 + n * 3) ~ n * m / 32 + n^2/10. Вот решение. 9-ое место в списке лучших решений. Но что бы я делал без идеи битового сжатия.
Второе что помогло, так это подсмотренное у тебя разделение подсчета битовых масок, а уже после этого подсчет собственно сумм. Посчитаем битовые маски. Подсчет сумм можно огранизовать за n / K * (2^K + n), разбив все маски на группы по K бит (у меня было 11, и каждые 32 бита обрабатывались как 11 + 11 + 10). Бежим в цикле по группам. Для каждой из 2^11 масок посчитаем соответствующую сумму, запишем в массив sum[1 << K]. Затем пройдемся по всем вершинам, вычленим нужные K бит, и добавим к ответу для этой вершины sum[bit_mask].
PS: читаю scanf, вывожу printf, время работы 18.19 секунды.
UPD: твой инпут/аутпут ускоряет до 14.00 секунд.
ЗЫЗЫ:
а чем так не правильно читать инпут? WA получает
Предлагаю свою версию: делаем сжатие компонент сильной связности. После этого - топсорт и динамика, начиная от "тупиков".
UPD: уже понял ошибку. Думаю, как исправить.