Assign the task(dfs序 線段樹)

2021-10-03 18:38:54 字數 2995 閱讀 9748

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到編號為的零食機的初始價值。接下來行,有兩種操作 ...