BZOJ 1577:貪欲[Usaco2009月] MRTフェアシャトル寺セグメントツリー_

コード:

#include <ビット/ STDC ++。H> 
に#define setIO(S)freopenは(S ".IN"、 "R"、STDIN)
の#define MAXN 10000000件
の#define LS(X << 1)
の#define RS((X << 1)| 1)
の#define中間((L + R)>> 1)
名前空間stdを使用。
構造体Q 
{ 
	int型のL、R、NUM。
	ブール演算子<(Q E)のconst 
	{ 
		戻りR == ER L?> EL:ER <R。  
	} 
}、Q [MAXN]。
int型K、N、C。
int型MAXV [MAXN]、怠惰[MAXN]。
ボイド押し上げ(INT X)
{ 
	MAXV [X] = MAX(MAXV [LS]、MAXV [RS])。  
}        
ボイドマーク(int型のx、int型デルタ)
{ 
	怠惰[X] + =デルタ、MAXV [X] + =デルタ。
} 
ボイドプッシュダウン(int型L、int型のR、 
{ 
	{ 
		IF(中間> = 1)マーク(LS、怠惰[X])。
		IF(中間+ 1 <= r)とマーク(RS、怠惰[X])。
		; [X] = 0怠惰 
	} 
} 
int型の照会(int型L、int型のR、int型のx、int型のL、int型R)
{ 
	IF(L> = L && R <= R)MAXV [X]を返します。
	プッシュダウン(L、R、X)。
	int型、T = 0; 
	IF(L <= MID)T =クエリ(L、中間、LS、L、R)。
	IF(R> MID)T = MAX(T、クエリ(MID + 1、R、RS、L、R)); 
	トンを返します。
} 
ボイド更新(int型L、int型のR、int型のx、int型のL、R INT、INTデルタ)
{ 
	プッシュダウン(L、R、X)。
	(L> = L && R <= R)であれば
	{ 
		マーク(X、デルタ); 
		返します。
	}	 
	IF(L <= MID)更新(L、中間、LS、L、R、デルタ); 
	IF(R> MID)更新(MID + 1、R、RS、L、R、
	突き上げ(X)。
} 
int型のmain()
{ 
	// setIO( "入力")。
	scanf関数(」
	scanf関数( "%D%D%D"、&Q [i]は.L&Q [i]を.R&Q [i]の.nu​​m);(;私は= Kを<++ I iは1 = INT)のために 
	ソート(Q + 1、Q + 1 + K)。  
	int型ANS = 0;    
    以下のために(; iは= Kを<; I = int型1 ++ I)
    {       
    	int型TMP =クエリ(1、nは、1、Q [i]は.L、Q [i]は.R-1)。      
    	ANS + =分(Q [i]が.nu​​m、C - TMP)。             
    	アップデート(1、nは、1、Q [i]は.L、Q [i]は.R-1、分(Q [i]が.nu​​m、C - TMP))。  
    } 
    のprintf( "%d個の\ n"、ANS)。
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/10975370.html