hdoj 3974
題意:有一家公司有n個員工(從1到n),公司裡每個員工都有乙個直接的老闆(除了整個公司的領導)。如果你是某人的直接老闆,那個人就是你的下屬,他的所有下屬也都是你的下屬。如果你是沒有人的老闆,那麼你就沒有下屬,沒有直接老闆的員工就是整個公司的領導,也就是說n個員工構成了一棵樹。公司通常把一些任務分配給一些員工來完成,當一項任務分配給某個人時,他/她會把它分配給他/她的所有下屬,換句話說,這個人和他/她的所有下屬在同一時間接受了一項任務。此外,每當員工收到乙個任務,他/她將停止當前任務(如果他/她有),並開始新的任務。在公司將某些任務分配給某個員工後,編寫乙個程式來幫助找出某個員工當前的任務。
即兩種操作:
dfs序就是將樹形結構轉化為線性結構,用dfs遍歷一遍這棵樹,進入到x節點有乙個in時間戳,遞迴退出時有乙個out時間戳。x節點的兩個時間戳之間遍歷到的點,就是根為x的子樹的所有節點,他們的dfs進入時間戳是遞增的。
同時兩個時間戳構成了乙個區間,x節點在這段區間的最左端,這個區間就是一棵根節點為x的子樹,對於區間的操作就是其他維護方式的應用了。
in[x]表示對映的dfs預處理出的線性結構,也就是說x是原始節點,in[x]是x節點的新位置。num[t]表示第t個節點的編號,num[in[x]]表示的還是x。
num是新序列,in表示是新序列的下標,in[x]~out[x]是x為根結點的子樹,劃分為乙個區間。
ll cnt=0;
void
dfs(ll x)
out[x]
=cnt;
}
回到這道題,先把每個老闆建乙個vector,員工是其元素
從領導開始建立dfs序,就能轉換成線性結構,找到區間用線段樹維護
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define pi acos(-1)
using
namespace std;
typedef
long
long ll;
typedef pair p;
const
int mod=
1e9+7;
const
int maxn=
5e4+10;
struct node tree[maxn<<2]
;ll n,m;
ll in[maxn]
,out[maxn]
;ll vis[maxn]
;//記錄員工出現,沒有出現過就是領導
vector g[maxn]
;//老闆管的員工
ll cnt;
void
dfs(ll x)
out[x]
=cnt;
}void
push_down
(ll p)
}void
build
(ll p, ll l, ll r)
ll m=
(l+r)
>>1;
build
(p<<
1,l,m)
,build
((p<<1)
|1,m+1
,r);
}void
update
(ll p, ll x, ll y, ll z)
push_down
(p);
ll m=
(tree[p]
.l+tree[p]
.r)>>1;
if(x<=m)
update
(p<<
1,x,y,z);if
(y>m)
update
((p<<1)
|1,x,y,z);}
ll query
(ll p, ll x)
push_down
(p);
ll m=
(tree[p]
.l+tree[p]
.r)>>1;
if(x<=m)
return
query
(p<<
1,x)
;else
return
query
((p<<1)
|1,x);
}int
main()
build(1
,1,n);
for(
int i=
1; i
) cnt=0;
for(
int i=
1; i<=n; i++)}
cin>>m;
cout<<
"case #"
<
<<
":"<
char tag;
ll x,y;
while
(m--
)else}}
return0;
}/********
1 5
4 3
3 2
1 3
5 2
5 c 3
t 2 1
c 3
t 3 2
c 3**********/
Assign the task(dfs序 線段樹)
題目傳送門 assign the task 給你一棵樹,共n個結點,每個結點具有乙個顏色,可以對結點進行染色和查詢 共n 1條邊,分n 1行分別包含兩個整數u和v,表示v是u的父節點 然後有m次操作 若為染色操作則輸入 t x k 若為查詢操作則輸入 c x 首先可以用dfs序將無根樹區間化,即可以...
dfs序 線段樹
傳送門 現有一棵樹,有以下操作 1.節點x及其所有子孫顏色都變更為k。2.要求你回答節點x的顏色。初始所有點都沒有染色。input 第一行乙個整數t t 10 表示樣例組數。對於每個測試樣例 第一行乙個整數n n 5e4 表示樹的節點個數。接下來n行,每行兩個整數u,v 1 u,v n 表示樹中u的...
HDU snacks (線段樹 dfs序)
problem description input 輸入資料第一行是乙個整數,表示有組測試資料。對於每組資料,包含兩個整數,表示有個零食機,次操作。接下來行,每行兩個整數和,表示編號為的零食機與編號為的零食機相連。接下來一行由個數組成,表示從編號為0到編號為的零食機的初始價值。接下來行,有兩種操作 ...