B. Игра
$ $ N камни свалили, начальный стек $ $ $ I $ a_i, каждая свая может быть выбран только, предполагая, что число груду $ X $, может занять лишь около нескольких $ X $, найти первый шаг верх выиграть эмулировать ,
SG вводные вопросы, все значения $ предварительной обработки $ SG. Для того, чтобы выиграть верх должен быть оставлен для удовлетворения FLAC XOR 0.
#include <iostream> #include <sstream> #include <алгоритм> #include <cstdio> #include <math.h> #include <набор> #include <карта> #include <очереди> #include <строка> #include < string.h> #include <BitSet> #define РЭП (я, а, п) для (INT I = а, я <= п; ++ я) #define ПЕР (я, а, п) для (INT I = п, я> = а; - я) #define ч putchar (10) #define пб push_back #define LC (O << 1) #define гс (ЖХ | 1) #define середины ((L + R) >> 1) #define Ls LC, л, средний #define RS гс, середина + 1, г #define х первый #define у второй #define ю станд :: IOS ::sync_with_stdio (ложь) #define епсИ '\ п' #define БД (а) ({REP (__ я, 1, п) соиЬ << а [__ я] <<»«; ч;}) с использованием пространства имен станд; ЬурейеЕ долго долго LL; ЬурейиЙ пар <Int, Int> PII; Const INT Р = 1e9 + 7, Р2 = 998244353, INF = 0x3f3f3f3f; LL НОД (LL а, Л.Л. б) {возвращение Ь НОД (Ь, а% б): а;} LL qpow (LL а, Л.Л. п) {LL г = 1% Р, ибо (в% = Р; п ; а = а * а% Р, п >> = 1) , если (п & 1) г = г * а% Р; возвращение г;} LL INV (LL х) {вернуться х <= 1 1: INV (Р% х) * (ПП / х)% р;} инлайн INT - й () {INT х = 0; р = символ GetChar (), в то время (р < '0' || р> '9') р = GetChar () , тогда как (р> = '0' && р <= '9') х = х * 10 + р-'0' , р = GetChar (); возвращение х;} // голова сопз Int N = 1e5 + 10; Int N, а [N], С. [Н], по отношению [N]; вектор <Int> FAC [N]; недействительными инициализации () { REP (я, 1, N-1) для (Int J = я, J <N; J + = я) FAC [J] .pb (я); REP (я, 1, N-1) { для (Int J: FAC [I]) по отношению [SG [IJ]] = я; REP (к, 0, N-1) , если ( по отношению [J] = я!) { ГГ [I] = J; перерыв; } } } INT основных () { инициализации (); зсапЕ ( "% d", & п); INT s = 0; REP (я, 1, п) { зсапЕ ( "% d", а + я); с ^ = SG [а [I]]; } Если возвращение путы ( "0"), 0 (s!); INT ANS = 0; REP (я, 1, п) { для (INT х: фак [а [я]]) { если (! (S ^ ГГ [а [я]] ^ С. [а [я] -x])) ++ анс; } } Е ( "% d \ п", ANS); }
D. красивые парки
Учитывая дерево, цвет точка $ I $ $ с [я] $, каждый из прошу за $ X $ всех цвета точки цвета от максимальной точки $ Y $.
Вывод: Для точки множества $ S $, $ S $ дерева наиболее удаленных от двух точек $ х, у $, то другая точка U $ $ $ уставка дальнее расстояние S должна быть $ $ $ в U или U $ $ $ $ X до $ Y $.
#include <iostream> #include <cstdio> #include <алгоритм> #include <очереди> #include <карта> #define РЭП (я, а, б) для (INT I = а; г <= Ь; я ++ ) с помощью патезраса; сопзЬ Int N = 1e5 + 10; Int N, Q, C [N], SZ [N], отд [N]; ИНТ фа [N], сын [N], топ [N]; INT F [N] , [2]; вектор <Int> г [Н]; б INT [N]; недействительными ДФС (INT х, Int, Int д е) { SZ [х] = 1, фа [х] = F, отд [х] = д; (! у = F): для (INT у г [х]) , если { ДФС (у, д + 1, х), SZ [х] + = SZ [у]; если (SZ [у]> SZ [сын [х]]) сын [х] = у; } } Пустота ДФС (INT х, Int Tf) { сверху [х] = тс; если (сын [х]) ДФС (сын [х], тс); для: (Top! [у]) (Int у г [х]) , если ДФС (у, у); } INT LCA (целое х, у INT) { в то время как (сверху [х] = сверху [у]!) { если (DEP [вверх [х]] <DEP [наверх [у]]) подкачки (х, у); х = фа [вершина [х]]; } Возвращение отд [х] <DEP [у] х: у; } Int Дис (INT х, Int у) { если (х || у!) Возвращение 0; вернуться отд [X] + отд [у] -2 * DEP [LCA (х, у)]; } Недействительной UPD (целое х) { INT & A = F [с [х]] [0], и B = F [с [х]] [1]; (! А) , если А = х; (! B) еще , если В = х; еще { INT d1 = дис (А, В), d2 = дис (А, х), d3 = дис (В, х); если (d2> d1 , d2 , &&> d3) { если (d2> d3) В = х; остальное A = X; } Иначе , если (d3> d1) А = х; } } INT основных () { зсапЕ ( "% d% d", & п, REP (я, 1, п) зсапЕ ( "% d", C + I), б [I] = с [I]; рода (Ь + 1, Ь + 1 + п), * б = единственный (Ь + 1, Ь + 1 + п) -b-1; REP (я, 1, п) с [I] = lower_bound (Ь + 1, Ь + 1 + * б, в [I]) - б; REP (я, 2, п) { Int U, V; зсапЕ ( "% d% d", & и, & v); г [и] .push_back (v); г [v] .push_back (и); } ДФС (1,0,0), поиск в глубину (1,1); REP (я, 1, п) UPD (я); в то время как (q--) { INT х, у; зсапЕ ( "% d% d", & х, & у); INT хх = lower_bound (Ь + 1, Ь + 1 + * Ь, х) -b; INT уу = lower_bound (Ь + 1, Ь + 1 + * б, у) -b; если (б [хх] = х || Ь [уу] = у!!) { пут ( "0"); Продолжить; } Х = хх, у = уу; INT ANS = 0; REP (я, 0,1) REP (J, 0,1) ANS = тах (ANS, дис (е [х] [I], Е ( "% d \ п", ANS); } }