Codeforces 1175Eは倍増しました

質問の意味:あなたをn回メートルの間隔を与え、常に[L、R]の間隔を尋ね尋ねたが、少なくともいくつかの間隔カバレッジを必要としますか?

考える:一つだけのセクション、および全範囲が範囲であれば、それは、カバレッジの問題の古典的な範囲で、我々はすべての欲を解決できることを知っています。今、私たちは、指定した間隔で、少なくともカバーする必要がすぐにどのように多くの間隔を知る必要があります。あなたが貪欲の範囲の問題を解決できるように、我々は予備的なアイデアを持って、我々は、最大の右の点で一定の事前ピップ範囲を含めることができます。しかし、このアプローチは確かに出て立ち往生することができますので、我々はプロセスを最適化するために乗算を使用し、STを設定する[i] [j]は2 ^ jは通常、位置Iから右端まで行くことができるの連続間隔を取ることです乗算処理をすることができます。セクションの左半分が不連続がある場合、それを-1に設定されている、ということに注意してください。そして、この方法を記入してみてください。剪定は、私たちは一つのセクションで読み、左のポイントが最大数(2 ^(MX - 1))に行くと判断された右のポイントにステップ、カバーが直接出力記述することができない場合はできません-1。

コード:

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
const int型MAXN = 500010; 
int型ST [MAXN] [20]。
INTのmain(){ 
	int型N、M、X、Y、MX = 0。
	memsetの(ST、-1、はsizeof(ST)); 
	scanf関数( "%d個の%のD"、&N、&M)。
	以下のために(INT i = 1; iが<= N; iは++){ 
		scanf関数( "%d個の%のD"、およびX&Y)。
		ST [X] [0] = MAX(ST [X] [0]、Y); 
	} 
	ため(INT i = 1; iが<= 5E5を、iは++){ 
		場合(STは[iが- 1] [0]> = iはSTを&& [I - 1] [0]> ST [i]が[0])
			ST [I] [0] STは= [I - 1] [0]。
	} 
	(MX = 1;(1 << MX)<= 5E5; MX ++)用の
		ための(INT J = 0であり、j <= 5E5; J ++){ 
			IF(ST [J] [MX - 1] == -1) ST [J] [MX] = -1。
			他のST [j]の[MX] = ST [ST [j]の[MX - 1]] [MX - 1];
		scanf関数( "%dの%のD"、およびX&Y)。
		int型ANS = 0; 
		IF(ST [X] [MX - 1] <Y){ 
			のprintf( " - 1 \ n"); 
			持続する; 
		} 
		{ - (; J> = 0 j-- 1 INT J = MX)用
			(ST [X] [J] <Y && ST [X] [J]> X)であれば{ 
				=(1 << | ANS J); 
				X = ST [X] [J]。
			} 
		} 
		のprintf( "%d個の\ n"、ANS + 1)。
	} 
}

  

おすすめ

転載: www.cnblogs.com/pkgunboat/p/10986488.html