DFS +セグメントツリーデータ構造クラスzhrt

zhrtデータ構造のコース

私はこのトピックは思考の少しDFS +ツリーラインだと思います

それはチェーンを持つツリーのように見えますが、書き込みに分割することができるが、この時のタイトルカードツリーセクション

木の前に、このセクションを書いてきたので、それを理解するために少し考えがあり、更新間隔、DFS +ツリーラインをしたいと考えてきました

その後、私たちは、この範囲が単一ポイントの更新更新に変換することができることを学んだルートノードにサブツリーがあることができれば、そのノードは、ルートノードでなければならない、木の子ノードをチェックすることです。

#include <cstdioを> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <iostreamの> 
する#include <アルゴリズム> 
の#include <cstdlib> 
の#include <ベクトル> 
の#include <スタック> 
の#include <地図> 
の#include <ストリング> 
#define INF 0x3f3f3f3f 
の#define inf64 0x3f3f3f3f3f3f3f3f 
名前空間stdを使用。
const int型MAXN = 4E5 + 10。
int型の合計[MAXN * 4]。

ボイドpush_up(int型のID)
{ 
	和[ID] =和[ID << 1 | 1] +和[ID << 1]。
} 

ボイドビルド(INT IDを、int型のL、R INT)
{ 
	IF(L == R)
	{ 
		和[ID] = 0; 
		返します。
	} 
	INT半ば=(L + R)> 
	ビルド(ID << 1、L、
	(ID << 1 | 1、ミッド+ 1、r)を構築します。
	push_up(ID)。
} 

ボイド更新(INT IDを、int型のL、int型のR、int型のPOS、int型のval)
{ 
	IF(L == R)
	{ 
		和[ID] + =ヴァル。
		返します。
	} 
	INT半ば=(L + R)>> 1。
	IF(POS <= MID)更新(ID << 1、L、中間、POS、ヴァル)。
	他の更新(ID << 1 | 1、ミッド+ 1、R、POS、val)で、
	push_up(ID)。
} 

INTクエリ(INT ID、int型のL、int型のR、int型のx、int型のY)
{ 
	//のprintf( "ID =%のDL =%のDR =%DX =%のDY =%d個の\ n"、ID、L、R 、x、y)は、
	IF(X <= L && Y> = r)は戻り和[ID]。
	INT半ば=(L + R)>> 1。
	int型ANS = 0; 
	年を返します。
}
	IF(X <= MID)ANS + =クエリ(ID <<
	もし(Y> MID)ANS + =クエリ(ID << 1 | 1、中間+ 1、R、X、Y)。 
		int型、V = EX [I] .V。
INT EL [MAXN]、ER [MAXN]、TOT = 0、ヘッド[MAXN]、CNT。
構造体ノード
{ 
	int型V、NXT。
	ノード(INT V = 0、INT NXT = 0):V(V)、NXT(NXT){} 
} EX [MAXN]。

ボイドのinit()
{ 
	memsetの(頭、-1、はsizeof(ヘッド))。
	TOT = 0、CNT = 0。
} 

ボイド追加(INT U、V INT)
{ 
	EX [CNT] =ノード(V、ヘッド[U])。
	ヘッド[U] = CNT ++。
	EX [CNT] =ノード(U、ヘッド[V])。
	ヘッド[V] = CNT ++。
	//のprintf( "U =%DV =%D \ n"は、U、V)。
} 

ボイドDFS(INT U、INT PRE)
{ 
	エル[U] = ++ TOT。
	以下のために(INT I =ヘッド[U];!I = - 1; I = EX [I] .nxt)
	{ 
		(V ==予備)が続けば、
		DFS(V、U); 
	} 
	ER [U]はTOTを=。
	//のprintf( "EL [%のD] =%d個のER [%のD] =%Dを\ n"、U、EL [U]、U、ER [U])。
} 

int型のmain()
{ 
	int型のT。
	scanf関数( "%のD"、&T)。
	一方、(t--)
	{ 
		INIT()。
		N INT、M。
		scanf関数( "%d個の%のD"、&N、&M)。
		(1、1、n)の構築。
		以下のために(INT i = 1; iがn <; iは++)
		{ 
			UをINT、V。
			scanf関数( "%d個の%d個"、&U、&V); 
			(V、U)を追加します。
		} 
		DFS(1、-1)。
		(M--)しながら
		{ 
			int型OPT、X; 
			scanf関数( "%d個の%d個"、&が選ぶ、&​​x)は、
			IF(OPT == 0)更新(1、1、nは、EL [x]は、1)。 
			{ 
				int型ANS =クエリ(1、1、nは、EL [x]は、ER [X])。
			もし(OPT == 2)
				他のprintf( "いいえ\ nを"); 
			} 
		} 
	} 
}

  

おすすめ

転載: www.cnblogs.com/EchoZQN/p/11334372.html