HDU 3974割り当てタスク(セグメントツリーのDFS配列)

問題の説明

(Nに1から番号)Nの従業員を持つ会社、企業内のすべての従業員があなたが誰かの直接の上司です.IF、その人はあなたの部下である(全体の企業のリーダーを除く)の即時上司を持っているがあり、そして、すべての部下は、同様にあなたの部下です。あなたは誰のボスである場合、あなたは何の部下を持っていない、即時上司を持っていない従業員は、それがNの従業員がツリーを形成する意味全体company.Soのリーダーです。

同社は通常、タスクが誰に割り当てられているfinish.Whenするためにいくつかの従業員にいくつかのタスクを割り当てて、彼/彼女はすべての彼/彼女のsubordinates.In他の言葉にそれを割り当てます、人とすべての彼/彼女の部下は、タスクを受け同時。従業員がタスクを受け取った時はいつでもまた、彼/彼女が(彼/彼女が持っている場合)、現在のタスクを停止し、新しいものを開始します。

同社は一部の従業員にいくつかのタスクを割り当てた後、一部の従業員の現在のタスクを考え出すのに役立つだろうプログラムを書きます。
 

 

入力

最初の行は、単一の正の整数T(Tは<= 10)が含まれ、テストケースの数を示します。

各テストケースのため:

最初の行には、従業員の数である整数N(N≤50,000)を含みます。

次のN - 1行の各従業員vを意味する二つの整数uおよびvを含む従業員の即時ボスU(1 <= U、V <= N)です。

次の行は、整数M(M≤50,000)を含みます。

次のMライン毎のいずれかであるメッセージ含有

「C X」社員Xの現在のタスクの問い合わせを意味する

か、

会社は従業員xにタスクyを割り当てる手段「T Xのyを」。

(1 <= xと<= N、0 <= Y <= 10 ^ 9)
 

 

出力

各テストケースのために、行ごと対応する回答を最初の行(1から始まる)テストケース番号を出力して、すべての問い合わせのために、出力。
 

 

サンプル入力

1 5 4 3 3 2 1 3 5 2 5 C 3 T 2 1 C 3 T 3 2 C 3
 

 

サンプル出力

ケース#1:-1 1 2

アイデア:

ツリーにDFS順序問題のツリーラインの確立はとても根本的な問題は、新しい+の問い合わせの単一ポイントとの間隔に変換され、彼の息子のノードがあり、私たちが注文DFSのポイントを見つけることができますいくつかの問題の範囲とすることができます

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
constの ダブル PI = ACOS( - 1.0 )。
CONSTの INT N = 5E4 + 7 const  int型 INF = 0x3f3f3f3f constの ダブル EPS = 1E- 6 
typedefの長い 長いLL。
CONST LL MOD = 1E9 + 7 構造体縁{
     INT 次、V。
}。
エッジe [N << 1 ]。
int型のヘッド[N]、CNT、TOT、L [N]、フラグ[N]、R [N]。
空隙INIT(){ 
    CNT = 0 
    TOT = 0 ; 
    memsetの(頭、0はsizeof (ヘッド))。
    memset(フラグ、0はsizeof (フラグ))。
} 
ボイド追加(INT U、INT V){ 
    E [ ++ CNT = 縁{ヘッド[U]、V}。
    ヘッド[U] = CNT。
} 
ボイド DFS(INT U){ 
    L [U]は = ++ TOT。
    int型 I =ヘッド[U]; iは、I = E [I] .next){
         int型V = E [I] .V。
        DFS(V); 
    } 
    R [U] = ++ TOT。
} 
構造体ツリー{
     int型のL、R、V、怠惰。
} T [N << 2 ]。
ボイドビルド(INT P、int型の L、INT R){ 
    T [P] .L = L。T [P] .R = R。T [P] .V = - 1T [P] .lazy = 0 もし(L == R)のリターン;
    INT半ば=(L + R)>> 1 
    構築した(p << 1 、L、ミッド)。
    P(ビルド << 1 |1、中間+ 1 、R)。
} 
ボイドプッシュダウン(INT P){
     もし(T [P] .lazy){ 
        T [P << 1 ] .V = T [P] .lazy。
        T [P << 1 | 1 ] .V = T [P] .lazy。
        T [P << 1 ] .lazy = T [P] .lazy。
        T [P << 1 | 1 ] .lazy = T [P] .lazy。
        T [P] .lazy = 0 
    } 
} 
ボイド更新(int型 P、int型の L、INTR、INT V){
     場合(L <= T [P] .L && T [P] .R <= R){ 
        T [P] .lazy = V。
        T [P] .V = V。
        返します
    } 
    プッシュダウン(P); 
    INT半ば=(T [P] .L + T [P] .R)>> 1 もし(L <= MID)更新(P << 1 、L、R、V)。
    もし(R> MID)更新(P << 1 | 1 、L、R、V)。
} 
INTクエリ(INT P、INT X){
     もし(T [P] Tを== .L [P] .R && T [P] .L == X){
         リターン T [P] .V。
    } 
    プッシュダウン(P); 
    INT半ば=(T [P] .L + T [P] .R)>> 1 int型のres;
    もし(x <= MID)のRES =クエリ(P << 1 、X)。
    のres =クエリ(P << 1 | 1 、x)は、
    リターンのres; 
} 
int型のmain(){ 
    IOS :: sync_with_stdio()。
    cin.tie(0)。cout.tie(0 )。
    int型のトン。cinを>> トン。
    INT W = 0 一方、(t-- ){ 
        COUT << "ケース#" << ++ W << " " << ENDL; 
        のinit(); 
        int型 N、M; CIN >> N;
         のためint型 i = 1 ; iは<N; iは++ ){
             int型、V Uと、CIN> > U >> V、
            (V、U)を追加し、
            フラグ[U] = 1 ; 
        } 
        int型S;
         のためint型 I = 1を iが++; iが<= N であれば(!フラグ[i])と{ 
                S = I ; ブレーク 
        DFS(S); ;
            } 
        ビルド(11、N << 1 )。
        cinを >> メートル。
        以下のためにint型私= 1 ; I <= M; iが++ ){
             チャー OP。cinを>> オペアンプ。
            もし(OP == ' C ' ){
                 int型のX; cinを>> X; 
                COUT <<クエリ(1、L [X])<< ENDL。
            } {
                 int型 X、Y。CIN >> X >> Y。
                アップデート(1、L [x]は、R [X]、Y); 
            } 
        } 
    } 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/wmj6/p/11431924.html