[UOJの#393]] [NOI2018リターンジャーニー

タイトル効果:図$縁の点$ $する$ N-Mであり、各側は、二つの属性$ a_iを、b_i $を有します。$ Qは$クエリが与えられたそれぞれの$ V、Pの$、すべての側面$ b_i \ leqslant P $エッジがマークされますを示すには、V $ $ポイントを求めて、あり、任意の点がマークされていないエッジによって到達することができます、その後、最小の$ \和a_iを$ $ 1 $到達ポイント、最小値の出力。複数のデータセット

$ Nは\ leqslant2 \ times10 ^ 5、M \ leqslant4 \ times10 ^ 5 $、$ 3 $は、データを設定します。

解釈: $ \ mathrm {} $クラスカルツリーが再構築は、構築された$ $ B_iは、ツリーを再構成下降することにより、ポイントがマークされていない場合、そのサブツリー内にマークされていない、ポイントは$ 1とすることができる見つけることができます$最短実行し、各ノードのサブツリーの最新の値を記録します。注、$ \ mathrm {SPFA} $が死んで、$ \ mathrm {ダイクストラ} $を使用します。

ポイントカード:複数のデータセット、エラーをクリア

 

C ++コード:

#include <cstdioを> 
する#include <CStringの> 
する#include <iostreamの> 
する#include <アルゴリズム> 
のconst int型MAXN = 6E5 + 10。

INTティム、N、M、N、Q、K、S、F [MAXN]、W [MAXN]。
INT _U [MAXN]、_V [MAXN]、[MAXN] [MAXN]、_a [MAXN]、RNKを_L。
インラインBOOL CMP(INT A、INT B){戻り_a [A]> _a [B]。} 
INT(INT X){[x]はfをX ==を返す検索?X:([X] = [X])F(見つけるF)。} 
長い長いDIS [MAXN]。

名前空間グラフ{ 
	int型のヘッド[MAXN]、CNT。
	構造体のエッジ{ 
		にINT、NXT、W。
	} E [MAXN << 1]。
	ボイドaddedge {(int型B、INT C INT)
		E [++ CNT] =(エッジ){B、ヘッド[A]、C}。[A] = CNTヘッド。
		E [++ CNT] =(エッジ){、ヘッド[B]、C}。ヘッド[B] = CNT。
	}
	無効クリア(){memsetの(頭、0、はsizeofヘッド)、CNT = 0。} 

	int型V [MAXN << 2]。
	インラインINT getmin(INT A、INT B){DIS [B] <[A] DISを返しますか?A:B; } 
	ボイド変更(int型RT、INT LをINT R、INT P、INT V){ 
		IF(L == R){V [RT] = V。返します。} 
		INT半ば= L + R >> 1。
		IF(p <= MID)変更(RT << 1、L、中間、P、V)。
		それ以外の変更(RT << 1 | 1、ミッド+ 1、R、P、V); 
		V [RT] = getmin(V [RT << 1]、V [RT << 1 | 1])。
	} 

	ボイドダイクストラ(int型S){ 
		memsetの(DIS、0x3fを、はsizeof DIS)、memsetの(V、0、はsizeofのV)。
		DIS [S] = 0、(1,1、N、S、S)を変更します。
		{(;ティム--Tim INTティム= N)のために
			INT U = V [1]。修正(1、1、N、U、0); 
			(V、I =ヘッド[U] int型のために、私は、I = E [I]。
				V = E [I] .TO。
				IF(DIS [V]> DIS [U] + E [i]は.W)
					DIS [V] = DIS [U] + E [I] .W、修正(1、1、N、V、V)。
			} 
		} 
	} 
} 

のconst int型M = 24。
INT FA [MAXN] [M + 1]。
ボイドaddedge(INT A、INT B){ 
	FA [B] [0] =、DIS [A] = STD ::分(DIS [A]、DIS [B])。
} 
長い長いクエリ(int型V、int型P){ 
	(INT I = M;〜I; --I)のためにIF(W [FA [V] [I]]> P)V = FA [V] [I] ; 
	[V] DISを返します。
} 

int型のmain(){ 
	のstd :: IOS :: sync_with_stdio(偽)のstd :: cin.tie(0)、STD :: cout.tie(0)。
	std :: cinを>>ティム。
	一方、(ティム- > 0){ 
		グラフ::(クリア)、[0] = -0x3f3f3f3f、memsetをW(FA、0、はsizeof FA)。

		std :: CIN >> N >> M、N = N。
		{(; I <M ++ I I = 0、L INT)のため
			のstd :: CIN >> _U [I] >> _v [I] >> L >> _aの[I]。
			グラフ:: addedge(_U [i]は、[i]は、Lを_V)。
			RNK [I] = I。
		} 
		グラフ::ダイクストラ(1)。

		以下のために(INT i = 1; iが<= N + M; ++ I)F [I] = I。
		STD ::ソート(RNK、RNK + M、CMP)。
		ため(= 0は、Uは、V、I int型、iがmで<; ++ I){ 
			U =を見つける(_U [RNK [I])、V =見つける(_V [RNK [I])。
			IF(!U = V){ 
				addedge(++ N、U)、addedge(N、V)。
				W [N] = _a [RNK [I]、F [U] = F [V] = N。
			} 
		} 
		のために(; I <= M + I i = 1からINT)
			のための(int型J = 1; J <= N; ++ j)は
				、FA [J] [i]は= FA [FA [J] [Iを- 1] [I - 1]。

		std :: cinを>> Q >> K >> S。
		長い長いV、P、
		一方、(Q - > 0){
			std :: cinを>> V >> P; 
			もし(K)V =(V + ANS - 1)%N + 1、
				P =(P + ANS)%(S + 1)。
			ANS =クエリ(V、P)。
			std :: coutの<< ANS << '\ nの'; 
		} 
	} 
	0を返します。
}

  

おすすめ

転載: www.cnblogs.com/Memory-of-winter/p/11628351.html