Assign the task(dfs序 線段樹)

2021-10-24 16:25:59 字數 1687 閱讀 4368

題目傳送門

assign the task

給你一棵樹,共n個結點,每個結點具有乙個顏色,可以對結點進行染色和查詢

共n-1條邊,分n-1行分別包含兩個整數u和v,表示v是u的父節點

然後有m次操作

若為染色操作則輸入「t x k」

若為查詢操作則輸入「c x」

首先可以用dfs序將無根樹區間化,即可以求出每個節點的管轄區間

然後就是區間修改,單點查詢即可,維護每個點的值即可

#include

using namespace std;

typedef pair<

int,

int> pii;

#define debug(a) cout<<#a<<"="<#define inf 0x3f3f3f3f

const

int n=

5e4+9;

int t, n, u, v, m, x, y, res;

int lid[n]

, rid[n]

, vis[n]

;char op;

vector<

int>g[n]

;struct segtreetr[n<<2]

;inline

void

dfs(

int v)

inline

intlc

(int p)

inline

intrc

(int p)

inline

void

build

(int p,

int l,

int r)

inline

voidf(

int p,

int k)

inline

void

push_down

(int p)

inline

void

updata

(int p,

int l,

int r,

int x,

int y,

int k)

if(tr[p]

.lazy)

push_down

(p);

int mid=

(x+y)

>>1;

updata(lc

(p), l, r, x, mid, k)

;updata(rc

(p), l, r, mid+

1, y, k);}

inline

intquery

(int p,

int d,

int x,

int y)

signed

main()

for(

int i=

1; i<=n; i++)if

(!vis[i]

)dfs

(i);

cin>>m;

printf

("case #%d:\n"

,++count)

;for

(int i=

1; i<=m; i++

)else

if(op==

't')}}

return0;

}

Assign the task(dfs序 線段樹)

hdoj 3974 題意 有一家公司有n個員工 從1到n 公司裡每個員工都有乙個直接的老闆 除了整個公司的領導 如果你是某人的直接老闆,那個人就是你的下屬,他的所有下屬也都是你的下屬。如果你是沒有人的老闆,那麼你就沒有下屬,沒有直接老闆的員工就是整個公司的領導,也就是說n個員工構成了一棵樹。公司通常...

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