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 = 0。SZ [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 。 }