[解説] [閉じる] NKOJ P3545 - 単調なキュー

する#include <stdio.hに> 
する#include <ビット/ STDC ++ H> 
の#define H 100005 
名前空間stdを使用。
構造体ノード{int型V、ID;}合計[H]。
INT N、T、P。
ブールCMP(ノードA、ノードB){ 
	IF(AV == BV)戻りa.id <b.id。
	AV> BV返します。
} 
ボイドワーク(){ 
	int型のL、R、ANS、チャ。
	L = R =チャ= 1234567890。
	両端キュー<整数> Q; 
	以下のために(; iはi = 0 int型<N =、iは++){ 
		// 
		ながら(!。Q.empty()&&合計[Q.front()] V和[I] .V> = P){ 
			int型K = Q.front(); 
			INT A =分(合計[K] .ID、合計[I] .ID)。
			INT B = MAX(合計[k]は、.ID合計[I] .ID)。
			INT C =合計[K] .V和[I] .V。
			IF(CP <= CHA){ 
				IF(CP == CHA){ 
					IF(== 1)R =最小(R、B)。 
					他の場合(A <L)L = A、R = B。
				ANS = C他、A = L、B = R&LT; 
				
				チャは、CPを=; 
			} 
			Q.pop_front(); 
		} // Pは差以上である場合に議論
		Q.push_back(I)
		IF(Q.size()=! 1){ 
			Q.front K =を(INT); 
			INT = A分(合計[K]は.ID、合計[I] .ID); 
			int型B = MAX(合計[K]は、合計[I] .IDを.ID )
			;合計C = [K] .V和[I] .V INT 
			IF(PC <= CHA){ 
				IF(PC == CHA){ 
					IF(== 1)R&LT =分(R&LT、B) ; 
					そうでなければIF(<L)、A = L、B = R&LT; 
				} 
				そうANS = C、= L、B = R&LT; 
				チャは、PCを=; 
			} 
		議論} //差がPに等しい未満である
	} 
	(printfの" %D D D %% \ N-」、ANS ,. 1 + L、R&LT); 
} 
		合計[I] .ID = Iであり; 
	} 
int型のmain(){ 
	scanfの( "%Dの%のD"、N& 、&​​T)
	のための(INT I = 1; Iは= Nを<。I ++){
		X INT; scanfの( "%のD"、およびX)、
		合計[I] .V =合計[-I 1] .V + X; 
	ソート(合計、合計+ N + 1、CMPは、。);特定の//配列[0、N]並びから連続区間が存在することになるので、[1、i]はの
	一方(T - ){ 
		scanfの( "%のD"、P&); 
		ワーク(); 
	} 
}
  

  

おすすめ

転載: www.cnblogs.com/go-bananas/p/11348231.html