HDU6241 17CCPCハルビンL

http://acm.hdu.edu.cn/showproblem.php?pid=6241

判断のバイナリ回答> =上下に、それが存在する場合は実行可能であることを示す場合、変換は、少なくとも上下点の点まで元のサブジェクト・サブツリーに限定することができます。

 

ゲームはこれが(霧)をオフに渡すために、あまりにもシンプルだと思う場合は、実際には、これはすべてのリットルの保証限り、正しさの証明である<= rと、L1 <= xの<= Rの場合、x黒ドットの場合に実現可能。

書式#include <マップ> 
書式#include < 設定 > 
書式#include <ctimeの> 
の#include <cmath> 
の#include <キュー> 
の#include <スタック> 
の#include <ベクトル> 
の#include < 文字列 > 
の#include <ビットセット> 
の#include <cstdioを> 
#include <cstdlib> 
の#include <CStringの> 
する#include <sstream提供> 
の#include <iostreamの> 
する#include <アルゴリズム> 
の#include <機能>
 使用して 名前空間STD。
#define(I、x、y)のための式(I = xをint型;方には<= yと; iが++)
 の#define(I、x、y)は_forための式(I = xをint型; I> = Y; i--)
 の#define MEM(F、X)のmemset(F、X、はsizeof(F))
 の#defineのSca(X)のscanf( "%dの"、およびX)
 の#define SCA2(X、Y)のscanf( "%D%dの"、およびX 、&​​Y)
 の#define SCA3(X、Y、Z)のscanf( "%D%D%D"、およびX&Y、およびZ)が
 #defineする SCL(X)のscanf( "%のLLD"、およびX)
 の#defineぷり(Xは)のprintf( "%d個の\ n"、X)
 の#define PRL(X)のprintf( "%LLDする\ n"、X)
 の#define CLR(U)のために(INT i = 0; iが= Nを<; I ++)は、U [I] .clear();
#defineは長い長いLL
 の#define ULL符号なしの長い長い
 の#define融点make_pairの
 に#define PIIペア<int型、int型>
 の#definePIL対<整数、長い長い>
 の#define PLLペア<長い長い、長い長い>
 の#define PB一back
 の#define第FI
 の#define SE第二
のtypedefベクトル < INT > VI。
INTは READ(){ int型のx = 0、F = 1チャー C = GETCHAR()。一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')、F = - 1 ; C = GETCHAR();}
 一方(> = C '0 ' && C <= ' 9 '){X = X * 10 + C - ' 0 ' ; C = GETCHAR();} 戻りのx *のF;}
 CONST  ダブル PI = ACOS( - 1.0 )。
constの ダブル EPS = 1E- 9 const  int型 MAXN = 2E5 + 10 const  int型 INF = 0x3f3f3f3f const  int型 MOD = 1E9 + 7 整数N、M、K。
構造体のエッジ{
     INT 次へ。
}エッジ[MAXN* 2 ]。
int型のヘッド[MAXN]、TOT;
無効{INIT()の
     ためのint型 I = 0 - [I] =ヘッドiが++; iが<= N)1 
    TOT = 0 ; 
} 
ボイド追加(INT U、INT V){ 
    エッジ[TOT] .TO = V。
    エッジ【TOT] .next = 頭部[U]。
    ヘッド[U]は ++ TOTを= 
} 
LLのL [MAXN]、R [MAXN]、最大[MAXN]、ダウン[MAXN]、SZ [MAXN]。
無効 DFS(int型の合計値、int型のu、INT LA){ 
    LLのL = 0、R = 0SZ [U] = 1 
    ダウン[U] = 1 [U]。アップ[U] =和- R [U]。
    int型 ;〜I; I =ヘッド[U] I = エッジ[I] .next){
         int型 V = エッジ[I] .TO。
        もし(V == LA)続けます
        DFS(合計、V、U); 
        SZ [U] + = SZ [V]。
        L + =ダウン[V]。R + = 最大[V]。
    } 
    ダウン[U] = MAX(ダウン[U]、L)。
    アップ[U] = 分([U] SZ、[U]まで)。 
    最大[U] =分([U]アップ、R + 1); 
} 
ブールチェック(INT X){ 
    DFS(X、1、 - 1)。ブールフラグ= もし(アップ[ 1 ] <X ||ダウン[ 1 ]> x)を返し int型 iは= 1 ; iが<= N iが++ ){
         場合(最大[I] <ダウン[I])を返す 
    } 
    を返す 
} 
INT 解く(){
     int型のL = 0、R = N。
    int型 ANS = - 1 ;
    一方、(L <= R){
         int型の M = L + R >> 1 もし(チェック(M)){ 
            R = M - 1 
            ANS = M。
        } { 
            L = M + 1 
        } 
    } 
    戻りANS。
} 
int型のmain(){
     int型のT。スキャット);
    一方、(T-- ){ 
        たSca(N)。その中に();
        以下のためのint型私は=1 ; iが<= N。I ++)L [I] = R [I] = 0 ;
        以下のためにint型 i = 1 ; iが<= N - 1 ; iは++ ){
             int型Uを、V。SCA2(U、V); 
            (V、U)を追加します。(V、U)を追加。
        } 
        のSca(M)。
        一方、(M-- ){
             int型 LLのnumは=; P =読み取る()読み取り(); 
            L [P] = MAX(L [P]、NUM)。
        } 
        のSca(M)。
        一方、(M-- ){
             int型の P =(読み取り); LL NUM = MAX(R [P]、NUM)。読み取り();
            R [P] = 
        } 
        ぷり(解きます())。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Hugh-Locke/p/11324108.html