[CSP-Sシミュレーション試験]:カバー(単調単調キュースタック++ + DP)

トピックポータル(内部タイトル126)


入力形式

  二つの整数$ Nの最初の行は、ライトの数と長さ間隔が$ Mで表されます。
  次$ M $三つの整数の列$ L_iを、R_iを、a_iを$間隔を表すことランタンおよびその美的外観を覆うことができます。


出力フォーマット

  出力ライン$ M $の整数、私は$ =最大美観$ I $ $ kの数を示します。


サンプル

サンプル入力:

6 25
1 2 10
2 3 10
1 3 21
3 4 10
5 10
3 5 19

出力例:

41 80 80 80 80 80


データ範囲とヒント

  $ 25 \%の$データ、$ M \ leqslant 20 $
  $ 45 \%の$データ、$ N、M \ leqslant 5,000 $
  追加の$ 25のデータ\%は、全て$同じa_iを$ $
  $ 100のための\の%$をデータ、$ 1 \ leqslant L_iを\ leqslant R_iを\ leqslant N、M \ leqslant 300,000 a_iを\ leqslant 10 ^ 9 $


問題の解決策

オーバーラップしないので、これ部カバーもエッジれるすべてのセクションは、スタック単調性を維持すること。

そして、各ノードのツリーは、同様のツリー$ DP $を考えて、その親を更新するキュー単調な答えを維持します。

時間複雑:$ \シータ(N \ Nログ)$。

期待はスコア:$ $ 100ポイントを。

実際のスコア:$ $ 100ポイント。


コードの時間

#include <ビット/ STDC ++。H>
名前空間stdを使用。
S [400001]; REC {int型のID、L、R}ストラクト。
構造体ノード{int型NXT、へ;} E [700001]。
int型ヘッド[400001]、CNT;
整数N、M。
int型になりました= 2;
int型のサイズ[300001]。
長い長いANS;
PRIORITY_QUEUE <長い長い> Q [400001]、V。
ブールCMP(REC A、REC B){戻りら<BL ||(AL == BL && a.r> BR)||(AL == BL && a.r == BR && a.id> b.id);}
無効アドオン(int型のx、int型のY)
{
	E [++ CNT] .nxt =頭部[X]。
	E [CNT] .TO = Y。
	ヘッド[X] = CNT。
}
空のビルド(int型x)は、
{
	一方、(S [X] .L <= S [今] .L && S [今] .R <= S [X] .R)
	{
		(X、今)を追加。
		今++;
		ビルド(今-1);
	}
}
無効DFS(int型x)は、
{
	(私は、Eは= [I] .nxt; I iは[x]はヘッド= INT)のために
	{
		DFS(E [I] .TO)。
		サイズ[X] = MAX(サイズ[X]、サイズ[E [i]の.TO])。
	}
	サイズ[X] ++;
	(私は、Eは= [I] .nxt; I iは[x]はヘッド= INT)のために
		IF(サイズ[E [I] .TO] + 1つの==サイズ[X]){スワップ(Q [x]が、Q [E [i]の.TO]); E [I] .TO = 0;ブレーク。 }
	(私は、Eは= [I] .nxt; I iは[x]はヘッド= INT)のために
	{
		もし(E [i]の.TO)
		{
			一方、(Q [E [i]の.TO] .size())
			{
				v.push(Q [x]は.top()+ Q [E [I] .TO] .top())。
				Q [X] .pop(); Q [E [i]の.TO] .pop()。
			}
			スワップ(V、Q [X])。
			しばらく(v.size())
			{
				Q [X] .push(v.top())。
				v.pop();
			}
		}
	}
	Q [X] .push(S [X] .A)。
}
メインint型()
{
	scanf関数( "%D%D"、&N、&M); N--。
	(I ++; I <= M I = 1の整数)のために
	{
		S [i]は.ID = I。
		scanf関数( "%D%D%D"、&S [i]は.L、&S [i]は.R&S [I] .A)。
		お客様 - ;
	}
	S [M ++] =(REC){M、1、nは、0}。
	ソート(S + 1、S + M + 1、CMP)。
	ビルド(1); DFS(1);
	Q [1] .push(0)のための(; I <= M I ++ INT iが= 1)。
	(I ++; I <M I = 1の整数)のために
	{
		年間+ = Q [1] .top()。
		Q [1] .pop()。
		printf( "%のLLD"、ANS)。
	}
	0を返します。
}

RP ++

おすすめ

転載: www.cnblogs.com/wzc521/p/11813683.html