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