Л Гу P3588 ПУС оптимизации дерева линии построена карта

URL: https://www.luogu.com.cn/problem/P3588

Значение вопросов:

Длина в последовательность положительных целых чисел п $ $, в диапазоне $ [1,1e9] $, что дает число $ s $ и $ M $ сообщений, каждое сообщение, содержащее $ L, R, K $ и $ K $ число, представляет $ A_L, A_L + 1 ...... A_r-1, A_r $ $ K $, в котором любой из множества оставшихся чем $ г-л 1-K $ номер + строгий большой. Или действительная последовательность конфигурации решения определения нет.

Решение:

Мы строго определены, как большой-направленный край в ориентированном графе от начала до конца, но теперь это период к периоду даже длины и последовательности, чтобы достичь $ 1e5 $, так что общий вид способа строительства, главным образом от размера пространства. Таким образом, мы оптимизируем вид дерева строительства сегмента. Завершение этой последовательности дерева сегмента, и для каждого интервала $ [L, R] $, можно разделить на малые $ к + 1 $ интервала (интервал элемента не может), то так как это $ R-L +- -k пункт меньше, чем $ $ K $ точек данного соединения требуется $ к * (г-л + к-1) $ ребер, мы можем рассмотреть супер узел подключен, а затем подключен к этому $ K $ указывают на. Каждый раз, когда этот путь будет связан $ г-л + 1 $ края, так что ребенок не может оставаться предметом. Рассмотрите возможность использования дерева сегмента, вам нужно всего лишь создать $ к + журнал (г-л + 1) $ ребер, дерево сегмент имеет $ $ NlogN стороны, общее число ребер равно $ (\ сумма к) + klogn + NlogN $ Статья сторона, вы можете.

Для каждого вопроса, вплоть до $ 1 + $ к соединяется с правым узлом Collage супер составляет $ 1 $, это супер узел связан с правом Collage $ K $ точек $ 0 $. Почему бы не превратить его? На самом деле, вы можете. Тогда сегмент дерево, очевидно, является дочерним узел даже вес $ 0 до $ стороны родительского узла, сторона закончена, даже после того, как топологического рода может, если он находится выше, чем значение целого числа или циклоалкильный $ $ 1E9, не решение.

AC код:

# include <бит / STDC ++ ч.> 
используя патезрас; 
Const INT MAXN = (1Е6 + 5); 
структура узла 
{ 
	INT L, R; 
}; 
узел тр [MAXN]; 
STRUCT край 
{ 
	Int к, ш; 
	ребро () {} 
	ребро (INT _to, Int _W): к (_to), ш (_w) {} 
	оператор BOOL <(Const край & а) сопзЬ 
	{ 
		возвращение ш> ав; 
	} 
}; 
вектор <край> G [MAXN]; 
INT НКТ; 
INT град [MAXN]; 
недействительные сборки (интермедиат & к.т., Int л, INT R) 
{ 
	если (л == г) 
	{ 
		Rt = л; 
		возвращение; 
	} 
	В = ++ CNT; 
	т = INT (L + R) >> 1; 
	сборки (тр [RT] .l, л, м);
	сборки (тр [RT] .r, т + 1, г); 
	G [тр [RT] .l] .push_back (ребро (к.т., 0)); 
	G [тр [RT] .r] .push_back (ребро (к.т., 0)); 
	град [RT] + = 2; 
} 
Недействительным обновление (интермедиат к.т., Int л, INT R, Int QL, Int QR, Int v) 
{ 
	если (л> г) 
		возвращение; 
	если (л <= QL && г> = дг) 
	{ 
		G [RT] .push_back (ребро (v, 1)); 
		++ град [v]; 
		возвращение; 
	} 
	INT т = (QL + QR) >> 1; 
	если (л <= м) 
		обновление (тр [RT] .l, L, R, QL, м, v); 
	если (г> м) 
		обновление (тр [RT] .r, L, R, M + 1, Qr, v); 
} 
Очереди <Int> Q; 
длинные длинные дис [MAXN]; 
INT Val [MAXN]; 
BOOL отношению [MAXN]; 
BOOL toposort () 
{
	для (INT I = 1; я <= CNT; ++ я) , 
		если (град [я]!) 
		{ 
			Q.push (я); 
			дис [I] = значение [я]? Val [I]: 1; 
		} В 
	то время как (Q.size ()) 
	{ 
		INT и = Q.front (); 
		Q.pop (); 
		по отношению [и] = 1; 
		для (авто я: G [и]) 
		{ 
			INT V = i.to, ш = IW; 
			--deg [v]; 
			дис [v] = тах (дис [V], дис [и] + W); 
			если ( по отношению [v] && град [v]!) 
			{ 
				если (значение [v]) 
				{ 
					если (дис [v]> Вэл [v]) 
						возвращение ложным; 
					дис [v] = значение [v]; 
				} 
				Q.push (v); 
			} 
		} 
	} 
	Для (INT I = 1; я <= CNT; ++ я)
		если ( по отношению [я] || дис [я]> 1e9!)  
			Возвращение ложным; 
	возвращает истину;
} 
INT к.т.; 
Int основной () 
{ 
	Int N, S, M; 
	зсапЕ ( "% d% d% d", & п, & с, & м); 
	CNT = п; 
	INT A, P; 
	в то время как (S--) 
	{ 
		зсапЕ ( "% d% d", & а, & р); 
		вал [а] = р; 
	} 
	INT Лас - , х, к, л, г; 
	сборки (к.т., 1, п); 
	в то время как (m--) 
	{ 
		зсапЕ ( "% d% d% d", & л, & г, & к); 
		лас = L; 
		++ НКТ; 
		в то время как (k--) 
		{ 
			зсапЕ ( "% d", & х); 
			обновление (к.т., Лас - , х - 1, 1, п, CNT); 
			G [CNT] .push_back (краевые (х, 0)); 
			++ град [х]; 
			лас = х + 1; 
	} 
	Если (! 
		toposort ()) Е ( "NIE \ п"); 
	еще
	{ 
		Е ( "TAK \ п"); 
		для (INT I = 1; я <= п; ++ я) 
			Е ( "% LLD% С", дис [I], я == п '\ п':? ' «); 
	} 
	Возвращает 0; 
}	

 

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

отwww.cnblogs.com/Aya-Uchida/p/12324108.html
рекомендация