習題 觀察(dfs序)

2022-07-22 06:54:08 字數 2279 閱讀 9172

如果你對樹剖足夠熟悉,那麼就有乙個\(o(n*log*log)\)的演算法,具體分數85'

其相當於從當前節點往上一直打標記,查的時候相當於直接找第乙個被打標記的點,

機房某64巨佬表示這不是卡卡就能過

#include#include#includeusing namespace std;

namespace io

while('0'<=c&&c<='9')

x*=f;

} void write(int x)

if(x>9)

write(x/10);

putchar(x%10+'0'); }}

using namespace io;

namespace tcs

tre[800000*4+5];

void build(int l,int r,int k)

void push_down(int k)

void change(int l,int r,int add,int k)

push_down(k);

change(l,r,add,k<<1);

change(l,r,add,k<<1|1);

tre[k].maxx=max(tre[k<<1].maxx,tre[k<<1|1].maxx);

} int findd(int k)

int ask(int l,int r,int k)

int debug(int pos,int k)

int cnt;

vectorg[800005];

int top[800005],dfn[800005],ori[800005];

int dep[800005],wson[800005],siz[800005],fath[800005];

void addedge(int u,int v)

void dfs1(int u,int fa)

}} void dfs2(int u,int top_chain)

if(dfn[x]>dfn[y])

swap(x,y);

change(dfn[x],dfn[y],val,1);

} int ask(int x)

if(dfn[x]>dfn[y])

swap(x,y);

int temp=ask(dfn[x],dfn[y],1);

if(temp==0)

return 0;

return ori[temp];

} }using namespace tcs;

int f_abs(int x)

int n,q;

int col[800005];

int main()

init(n);

for(int i=1,x;i<=q;i++)

while('0'<=c&&c<='9')

x*=f;

} void write(int x)

if(x>9)

write(x/10);

putchar(x%10+'0'); }}

using namespace io;

namespace tcs

void dfs1(int u,int fa)

}} void dfs2(int u,int top_chain)

if(dep[y]>dep[x])

swap(x,y);

return y; }}

using namespace tcs;

int f_abs(int x)

int n,q;

int col[800005];

sets;

int main()

init(n);

for(int i=1,x;i<=q;i++)

else

set::iterator t=s.upper_bound(x);

if(t==s.begin())

write(lca(ori[*t],ori[x]));

else if(t==s.end())

else

putchar('\n');

} }return 0;}/*

10 10

6 2 7 9 1 10 5 4 3-21

33-58

14-1-5

5 51 1 3 3 1-1

*/

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...

練習記錄 dfs序)

牛客每日一題 根據根右左的遍歷順序的到dfs序,再求lis即為可以選到的最多點。利用dfs序維護每種顏色的樹,大佬部落格 需要注意的是當只能取同一邊的兩個點時,要取dfs序差值最大的兩個點,可以想出反例,但不會證明。includeusing namespace std const int maxn ...