タイトル効果:図$縁の点$ $する$ 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を返します。 }