練習記錄 dfs序)

2021-10-11 18:43:07 字數 1264 閱讀 4544

**牛客每日一題

根據根右左的遍歷順序的到dfs序,再求lis即為可以選到的最多點。

利用dfs序維護每種顏色的樹,大佬部落格

需要注意的是當只能取同一邊的兩個點時,要取dfs序差值最大的兩個點,可以想出反例,但不會證明。

#includeusing namespace std;

const int maxn =1e5+5;

int head[maxn];

struct edge

};vectoredges;

void add_edge(int u,int v)

setop[maxn];

int f[maxn][20],col[maxn],dep[maxn];

int pre[maxn],in[maxn],out[maxn],cnt=0;

void dfs(int s,int fa)

out[s]=cnt;

}int get_lca(int x,int y)

} return f[x][0];

}int dis(int x,int y)

int num[maxn],ans[maxn];

void update(int x,int v)

else if(num[v]==1)

else

el=pre[el];

ans[v]+=dep[x]+dep[el]-2*dep[get_lca(x,el)];

} else

else

else

} be=pre[be],af=pre[af];

ans[v]+=(dis(x,be)+dis(x,af)-dis(be,af))/2;

} num[v]++;

}void del(int x)

else

else

else

}be=pre[be],af=pre[af];

ans[v]-=(dis(x,be)+dis(x,af)-dis(be,af))/2;

} num[v]--;

op[v].erase(in[x]);

}int n;

int main()

{ //freopen("in.txt","r",stdin);

scanf("%d",&n);

memset(head,-1,sizeof(head));

for(int i=1;i其實還是對子樹的操作,分奇偶層線段樹維護dfs序就可以了。

還沒寫,想到對每個高度維護dfs序。

刷題記錄(利用dfs序)

題目shy有一顆樹,樹有n個結點。有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 x,y x到y的路徑上的所有點的顏色都要與x和y相同。請統計方案數。一看題兩眼發懵,最終還是看題解了。利用dfs序來dp.先通過dfs確定dfs序 不用記錄回溯 之後分析一下,再選d...

dfs序 樹狀陣列

the first line contains an integer n n 100,000 which is the number of the forks in the tree.output for every inquiry,output the correspond answer per ...

dfs序及其應用

dfs序是用來處理子樹一類問題的,可以把子樹問題轉化為區間問題,以便借助線段樹或樹狀陣列處理。根據dfs的順序來給節點編號,在進入這個節點時更新in陣列,出去的時候更新out陣列,這樣以i為根的子樹的操作就可以變成區間 in i out i 的操作了。int in 100005 out 100005...