Wannafly вызов 23

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); 
	} 
}

 

рекомендация

отwww.cnblogs.com/uid001/p/10972827.html