POJ 1989(ビス互いに素なセット重量)

ナビゲーションナイトメア
制限時間:  2000ミリ秒   メモリの制限:  30000K
合計の提出:  8503   受け入れ:  3062
ケース制限時間:  1000ミリ秒

説明

ファーマージョンの牧歌的な近所ではNファーム(2 <= N <= 40,000)、通常1..Nラベル/番号があります。Mの系列(1 <= M <40,000)垂直方向と水平方向の道路様々な長さのそれぞれ(1 <=長さ<= 1000)ファームを接続します。これらの農場の地図は農場が接続農場間の明確化および長さについてF1..F7標識された下の図のようになります(N)として示されています。 
           F1 ---(13)---- F6 ---(9)----- F3
 
| |
(3)|
| (7)
F4 ---(20)-------- F2 |
| |
(2)F5
|
F7

ASCII図なので、それは当然のことながら、正確にはスケールではありません。 

各ファームは、南、正確北東、および/または西につながる道路を経由して、最大で4つの他の農場に直接接続することができます。また、農場のみ道路の端点に配置され、そしていくつかの農場は、各道路のすべてのエンドポイントで見つけることができます。どの2つの道路が交差していない、と正確に1つの経路 
(道路の配列)は、農場のすべてのペアをリンク。 

FJは、ファームマップの彼の論文のコピーを失い、彼は自分のコンピュータ上のバックアップ情報から、それを再構築したいと考えています。このデータは、以下の、すべての道路のための1つのような行が含まれています 

。#17ファームにファーム#23から北に実行されている長さ10の道路がある 
ファーム#17にファーム#1から東に実行されている長さ7の道がありますが 
... 

FJは、このデータを取得しているとして、彼は時折、そのような彼が彼のナビゲーショナル・チャレンジネイバーから受信した次のような質問によって中断され、農家ボブ: 

農場の#1と#23の間のマンハッタン距離とは何ですか? 

彼は(時々 、彼はまだ、まだ十分なデータを持っていない)ことができたときにFJは、ボブが答えます。ボブは農場のペアの間の「マンハッタン」の距離を知りたいので、上記の例では、答えは、17になります。 
| X1-X2 |二点(x1、y1)と(x2、y2)との間にマンハッタン距離だけです + | Y1-Y2 | (距離である大都市におけるタクシーは、二つのX、Yポイントを接続するために完全なグリッドで街の上に移動しなければなりません)。 

ボブは農場の特定のペアについて尋ねられたとき、FJはまだそれらの間の距離を推定するのに十分な情報を持っていない可能性があります。この場合には、FJはやたらと謝罪とで応答「-1」。 

入力

* 1行目:二スペース区切りの整数:NとM
 

の各行は、4つのスペースで区切られたエンティティを含み、F1、*ライン2..M + 1
道路を説明F2、L、及びD。F1とF2の数である
道路で接続された2つの農場、Lはその長さであり、Dが
いずれかの文字「N」、「E」、「S」、または「W」が与え
F1からの道路の方向をF2へ。

*行M + 2:単一の整数、K(1 <= K <= 10,000)、FBの数
照会

*ラインM + 3..M + K + 2:各行は農夫ボブからの問い合わせに対応
し、含まれてい3スペースで区切られた整数:F1、F2、およびI. F1
とF2は、クエリで2つの農場の数字であり、私はあります
ボブが求められた後のデータのインデックス(1 <= Iに<= M)
クエリを。データインデックス1は、ように、入力データの2行目にあり、。

出力

*行1..K:1行に1つの整数、ボブのそれぞれに対応し
 
たクエリ。各ラインは、距離のいずれか含まれている必要があり
、決定することは不可能である場合、測定又は-1を
適切な距離。

サンプル入力

7 6 
1 6 13 E 
6 3~9 E 
3 5 7 S 
4 1 3 N 
2 4 20 W 
4 7 2 S 
3 
1 6 1 
1 4 3 
2 6 6

サンプル出力

13 
-1 
10

ヒント

時間1では、FJは1と6の間の距離が13であることを知っている 
時間3において、1と4との間の距離は依然として不明です。 
終わりには、位置6西3つの単位及び2の7北であるので、距離は10です。 
 
問題の意味:入力nの最初の行、M。これは、n個の点、Mの関係を示しています。次の各行三列整数m、X、Y、LEN、文字c。Yは、X方向、長さlenにCを表します。
  今、Kを入力し、kは再びクエリ、A、B、状態を表しています。状態は、マンハッタン距離の状態を示し、出力点Aと点B
思考:重み値D1、D2アレイは、D1を保持するために、及びWはE維持するために使用されている(正でEを、Wは負です)。N及びS D2メモリ(S N負N)
   注kのグループは、状態がそうするとき、出力バックの行を並べ替えた後、事前に注文、大に必ずしも小さくはない尋ねました
  人ウォートン距離= ABS(D1 [X] - D1 [Y])+ ABS(D2 [X] - D2 [Y]);(これは間違ったWAの前に押さ)コードでプッシュ式エラーが注釈されていますの
書式#include <iostreamの> 
の#include <cmath> 
の#include <cstdioを> 
する#include <CStringの> 
の#include < 文字列 > 
の#include <マップ> 
書式#include <iomanip> 
書式#include <アルゴリズム> 
書式#include <キュー> 
の#include <スタック> 
#include < セット > 
の#include <ベクトル>
 // CONST int型MAXN = 1E5 + 5。
#defineは長い長いっ
{(-1,11,11- b)はLLのGCDをリターン?B GCD(B、%の; B)} 
(-1,11,11- b)は{LLのLCM 戻り、(/ GCDを

#define MAX INT_MAXは
 #defineする(; Iは= Bを<I ++は私はA = INT)ためFOR(I、A、B)で
 の#defineバグCOUT <<「------------- - 「<< ENDL
 使用して 名前空間STDを、
 int型 FA [ 41000 ]、D1 [ 41000 ]、D2 [ 41000 ;] 

構造体ノード
{ 
    int型のL、R&LT;
     int型のlen;
     チャーC; 
} V [ 41000 ];
 構造体クエリー
{ 
    INT Aを、B;
     int型の状態;
     int型NUB、CUNを; // NUBを第二のソートに、CUNが格納されている答え
} Q [ 41000 ]。
BOOL CMP(クエリX、クエリY)
{ 
    戻り x.state < y.state。
} 
ブールCMP2(クエリX、クエリY)
{ 
    戻り x.nub < y.nub。
} 
int型の検索(int型X)
{ 
    場合(X == FA [X])戻りX。
    INTのルート= (FA [X])を探します。
    D1 [X] + = D1 [FA [X]]。
    D2 [X] + = D2 [FA [X]]。
    戻り FA [X] = ルートと、
} 
ボイドは(解決int型のx、int型の Y、INT、LENをチャーC)
{ 
    int型の FX =検索(X)、FY = (y)を探します。
    FA [FY] = FX。

    もし(C == ' E ' ){ 
        D1 [FY] = D1を[X] + LEN - D1 [Y]。
        D2 [FY] = d2の[X] - D2 [Y]。
    } 

    そう なら(C == ' W ' ){ 
        D1 [FY] = D1を[X] - LEN - D1 [Y]。
        D2 [FY] = d2の[X] - D2 [Y]。
    } 
    そう なら(C == ' N ' ){ 
        D1 [FY]= D1 [X] - D1 [Y]。
        D2 [FY] = d2の[X] + LEN - D2 [Y]。
    } 
    そう なら(C == ' S ' ){ 
        D1 [FY] = D1を[X] - D1 [Y]。
        D2 [FY] = d2の[X] - LEN - D2 [Y]。
    } 
} 
intが(尋ねるint型のx、int型のY)
{ 

    int型 = FXを(x)を探します。
    int型 FY = (y)を見つけます。   
    もし(!FX = FY)のリターン - 1 int型の温度= 0 ; 
    一時 + = ABS(D1 [X] - D1 [Y])+ ABS(D2 [X] - D2 [Y])。
//     IF(D1 [X] * D1 [Y]> 0)TEMP + = ABS(D1 [X] - D1 [Y])。
//     そうでなければ一時+ = ABS(D1 [X])+ ABS(D1 [Y])。
//     IF(D2 [X] * D2 [Y]> 0)TEMP + = ABS(D2 [X] - D2 [Y])。
//     そうでなければ一時+ = ABS(D2 [X])+ ABS(D2 [Y])。
    戻り温度; 
} 
int型のmain()
{ 
//    freopenは( "C:\\ユーザー\\方瑞\\デスクトップ\\ INPUT.TXT"、 "R"、STDIN)。
//     freopenは( "C:\\ユーザー\\方瑞\\デスクトップ\\ output.txtと"、 "W"、STDOUT); 
    INTのN、M、K、尾; 
    scanf関数(" %d個の%のD "、&​​N、&M)。、N)FA [I] = I。
    (I、FOR 1、M)のscanf(" %D%D%D%C "、&​​V [i]は.L、&V [i]は.R&V [i]は.LEN、&V [i]は.C) ; 
    scanf関数(" %のD "、&K)。
    (I、FOR 1 、K){ 
        scanf関数(" %D%D%D "、&​​Q [i]は.A、&Q [i]は.B&Q [I] .state)。
        Q [i]は.nu​​b = I。
    } 
    ソート(Q + 1、Q + 1 + K、CMP)。 = 1 ;
    以下のためのint型 I = 1; I <= M; ++ I)
    { 
         +int型の L = V [i]は.L。
        INT R = V [i]は.R。
        チャー C = V [i]の.C。
        int型のlen = V [i]の.LEN。
        (L、R、LEN、C)を解きます。
        一方、(Q [尾] .state <= I &&尾<= K)
        { 

            int型 X = Q [尾] .A。
            INT Y = Q [尾] .B。
            Q [尾] .cun = (x、y)を尋ねます。 ++ ; 
        } 
    } 
    ソート(Q + 1、Q + 1 、K、CMP2)。
    (I、FOR 1、K)のprintf(" %d個の\ n " 、Q [i]の.cun)。

}

 

 

おすすめ

転載: www.cnblogs.com/jrfr/p/11409737.html