就是用dfs掃一遍將記錄子樹的段,然後維護段內的最大值,先對員工按照能力從大到小排序,能力相同的按照id從小到大排序,那麼按照這個順序插入,能力強的先出入,只需找到段中最大忠誠的即可,因為id小的先進,所以不會出現子樹中存在能力相同的子孫的情況,陣列開小了,wrong成狗....
#include #include #include #include #define max 50007
using namespace std;
struct node
}p[max];
int t,n,m;
struct edge
e[max<<1];
int head[max];
int cc,dep;
void add ( int u , int v )
int first[max],back[max],tid[1000007];
void dfs ( int u , int p )
back[u] = dep;
}struct tree
tree[max<<2];
void build ( int u , int l , int r )
void push_up ( int u )
void update ( int u , int x , int v )
int mid = l + r >> 1;
if ( x > mid ) update ( u<<1|1 , x , v );
else update ( u<<1 , x , v );
push_up ( u );
}int query ( int u , int left , int right )
int ans[max];
int main ( )
dep = -1;
dfs ( 0 , -1 );
sort ( p+1 , p+n );
build ( 1 , 1 , n );
memset ( ans , -1 , sizeof ( ans ));
for ( int i = 1 ; i < n ; i++ )
int q;
for ( int i = 1 ; i <= m ; i++ )
}}
HDOJ4366解題報告 dfs序 線段樹
題目概述 給出乙個公司所有員工的上下級關係 資料保證是一棵樹 現在想解雇一些員工,而他們的位置由他們的手下裡能力值比他大而且忠誠度最高的人來替代,給出m個詢問,求輸出替代他們的人的編號。大致思路 學習了一下dfs序的用法,附學習的部落格 簡單的說dfs序就是將一棵樹變成線性結構的演算法,並且保證點i...
hdu5692 dfs序線段樹
這是補的知識點,按先序遍歷的順序建立dfs序,用左右兩個值代表整個區間,因為dfs序最重要的特點就是子樹的區間是連續的 建立線段樹時,需要用重新標過的 下標來建立 pragma comment linker,stack 1024000000,1024000000 include include in...
dfs序 線段樹
傳送門 現有一棵樹,有以下操作 1.節點x及其所有子孫顏色都變更為k。2.要求你回答節點x的顏色。初始所有點都沒有染色。input 第一行乙個整數t t 10 表示樣例組數。對於每個測試樣例 第一行乙個整數n n 5e4 表示樹的節點個數。接下來n行,每行兩個整數u,v 1 u,v n 表示樹中u的...