BZOJ3211フローラは、(小さな新鮮なツリーライン)の国を旅しました

トピックポータル


件名の説明:

子バースト競争を回避する方法で、ウォーキングツアーなどのフローラ国。フローラは、ツアーのルートを持っている、それはそれはすべてが線配置の形で国を旅し、それぞれの国が(もちろん、神は、必ずしもすべての国を過ごすのが好きではありません)程度のような神を過ごすために持っている、と言うことです、線形です。

すべての旅行は、神が旅を幸せにもたらし、いくつかのために連続している、それは国の束だった、観光ルートを過ごすことを選ぶだろうこれらの国の神の花のように、当然のことながら、これらの国々でのお気に入りの和でありますプログラムは、特定の国に時々突然嫌悪一定ではないので、彼はこれらの国々に好きδすることになりδを(おそらくフローラの子供が退屈、これらの国でOIバースト) 。

フローラは今片道値フロールを要求して幸せ各旅程だけでなく、楽しみの度合いの変化を、与えられています。


入力フォーマット:

整数である最初の行N、それが発現されるN個の国と、
スペースで区切られたN個の整数の第2行、など各国の初期を示し、
第三行は整数であり、Mは存在表すM個の処理対象の情報が;
第4行の最後に、整数のような3の各列X、L、R、場合X = 1、すなわち、国楽しい値Rを走行xの和を求めたとき、Σ [デルタ] I(R〜L) 場合X = 2以下のような各国のときに状態LとR δ:私はなる[デルタ] I


出力フォーマット:

X = 1、整数1行に1つずつ。旅のハッピー表現。


例:

サンプル入力:

4
1 100 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4

出力例:

101
11
11


データ範囲とヒント:

すべてのデータについては、1≤n≤10 。5、1≤m≤2×10 5、1≤l≤r≤n、0≦ δ:私は 10≦ 9

注:これは、使用することをお勧めしSQRT関数、および切り捨て。


話題の意味:ツリーライン区間、区間合計で開かれました。


 ソリューション:

セクション情報は遅延マークを使用しないで、すぐに更新されません。(ひどいです)

しかし、10ということに注意してください9開いて最大5倍に変更します

0または1の電流範囲は、戻り時にすでにいっぱいになるまでので、各変更暴力が再帰的に続け

それはとてもハンサムではないでしょうか?


コードの時間:

#include <ビット/ STDC ++ H> 
の#define L(x)は、x << 1 
の#define R(x)は、x << 1 | 1 
使用して名前空間std。
N INT、M。
長い長いV [100001]。
長い長いTRSUM [400001]、TRMAX [400001]。
ボイド押し上げ(INT X)
{ 
	TRSUM [X] = TRSUM [L(X)] + TRSUM [R(X)]。
	TRMAX [X] = MAX(TRMAX [L(X)]、TRMAX [R(X)])。
} 
ボイドビルド(int型のx、int型、L、R INT)
{ 
	IF(L == R)
	{ 
		TRSUM [X] = TRMAX [X] = V [L]。
		返します。
	} 
	INT半ば=(L + R)>> 1。
	ビルド(L(x)は、L、MID)。
	ビルド(R(x)は、中間+ 1、R)。
	突き上げ(X)。
} 
ボイド変化(int型のx、int型のL、int型のR、int型のL、R INT)
{ 
	IF(L == R)
	{ 
		TRSUM [X] = SQRT(TRSUM [X])。
		TRMAX [X] SQRT(TRMAX [X])を=。
		返します。
	} 
	IF(TRMAX [X] <= 1)リターン; //注意这里为≤、其他跟普通线段树别无两样
	INT半ば=(L + R)>> 1。
	IF(L <= MID)変化(L(x)は、L、中、L、R)。
	IF(R> MID)変化(R(x)は、中間+ 1、R、L、R)。
	突き上げ(X)。
} 
長い長い尋ねる(int型のx、int型のL、int型のR、int型のL、int型R)
{ 
	IF(L <= 1 && R <= R)戻りTRSUM [X]。
	INT半ば=(L + R)>> 1。
	長い長いREC = 0; 
	IF(L <= MID)REC + =尋ねる(L(x)は、L、中、L、R)。
	IF(R> MID)REC + =(R(x)は、中間+ 1、R、L、R)を尋ねます。
	REC返します。
} 
int型のmain()
{ 
	scanf関数( "%のD"、&N); 
	以下のために(INT i = 1; iが<= N; iは++)
		scanf関数を( "%のLLD"、&V [I])。
	scanf関数( "%のD"、&M)。
		int型のOP、L、R。
		scanf関数( "%D%D%D"、&OP、&L&R)。
		(OP == 1)のprintf( "%LLDする\ n"は、(1,1、N、L、R)を尋ねる)場合。
		他の変化(1,1、N、L、R)。
	} 
	0を返します。
}

 CPP

RP ++

おすすめ

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