ナビゲーションNightmare--加重互いに素セット(マルチ重量)

トピックリンク

質問の意味:

Nファームを与え、次に時系列がMの相対位置ファームに関する情報を提供し、後述する時刻tで、Qを求め、Yマンハッタン距離のXの数はい。

ソリューション:

DX [i]を横軸I DYにルートノードを維持距離縦Iを維持するために、ルートノードから[I]

互いに素-設定し、効率的な場所、次のクエリは、直接の親を見つけることができるように、xの親ノードは、直接の親に接続するために、道に沿って下降します見つけるために、検索(x)関数を使用すると、そのすべてのノードであります符号fは、[X] =探すことを示している(F [X])。

その親ノード(DXの点までの距離を維持するために必要な場合互いに素セットメンテナンス裸を接触させる前には、比較的互いに素な集合であるが、このような問題点[X] + = DX [X] [F]。 )、その後、構築、検索(x)関数あなたは距離を維持すると同時に、考慮しなければならないとき、メンテナンスが間違っているから一度右の道をリードする可能性があります。

2つの点が同じセット親ノードの長手方向軸線から減算要求までの距離となり、横軸に属している場合、親ノードから横軸と縦軸に通信距離ブロック内のメンテナンスノードは、最初のクエリか否かを判断しますあなたは、マンハッタンから得ることができます

合併のコレクションはどのように焦点を当てて

 

ましょう  FX年度が向け即ち  F [FY] = FX  次いで分散議論

DX【[I] .f1】 - - 【私は】.L DYの【のFXを】= DY【[I] .f2】【FX】= DX【[I] .f2】D == WはDX如果-dy【[I] .f1】

DX【[I] .f1】+ A【I】.L DY [FX] = DY【[I] .f2】 - 【FX】= DX【[I] .f2】D == EがDX如果-dy【[I] .f1】

如果D == S DYの【のFX】= DY【[I] .f2】 - DY【[I] .f1】+【I】.L DX [FX] = DX【[I] .f2】 -dx【[I] .f1】

如果D == N DYの【のFX】= DY【[I] .f2】 - DY【[I] .f1】 - 【I】.L DX [FX] = DX【[I] .f2】 -dx【[I] .f1】

そして、上記の4例をマージ

 

コード:

#include <iostreamの> 
する#include <stdio.hに> 
する#include <math.h>の
書式#include <アルゴリズム> 
の#include <ベクトル>
 使用して 名前空間STD。
typedefの長い 長いLL。
const  int型 MAXN = 2E5 + 7 INT F [MAXN]、DX [MAXN]、DY [MAXN]。
構造体ノード
{ 
    int型F1、F2、L。
    char型のD; 
} [MAXN]。
INTのN、M、K。
INT検索(INT X)
{ 
    場合(F [X] == x)をリターンX。
    int型ルート= 検索(F [X])。
    DX [X] + = DX [X] [F]。
    DY [X] + = DY [F [X]]。
    戻り [X] = F ルート。
} 

int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N、&M)。
    以下のためにint型 I = 0 F [I] = iは++; iが<= N)I。
    以下のためにint型 I = 1 ; I <= M; iは++ 
    { 
        scanf関数(" %D%D%D "、および[I] .f1、&[I] .f2、&[I] .L)。
        CIN >> [I] .D。
    } 
    のscanf(" %dの"、&K)。

    int型 I = 1 ;
    ながら(k-- 
    { 
        int型、F1、F2、Lを 
        scanf関数(" %D%D%D "、&​​F1、およびF2、&L)。
        ながら(iは= < L)は
        { 
            int型の FXは= 検索([I] .f1)。
            int型 FY = ([i]の.f2)検索;
            もし(!FX = FY)
            { 
                F [FX] = FY。

                DX [FX] = DX [I] .f2] - DX [[I] .f1]。 
                DY [FX]= DY [I] .f2] - [[I] .f1] DY。

                場合([i]は== .Dを' W ')DX [FXは] - = [I] .L。
                他の 場合([i]が.D == ' E ')DX [FX] + = [I] .L。
                他の 場合([i]が.D == ' S ')DY [FX] + = [I] .L。
                 DY [FX] - = [i]は.Lを。
            } 
            私は ++します; 
        } 
        int型の FX = (F1)を探します。
        int型 FY = 検索(F2)。
        もし(FX!=年度)のprintf(" -1 \ nを" );
        
        { 
            INT ANS = ABS(DX [F1] -dx [F2])+ ABS(DY [F1] - DY [F2])。
            printf(" %d個の\ n " 、ANS)。
        } 

    } 

    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/j666/p/11615378.html