樹刨入個門?

2021-09-28 23:09:30 字數 3163 閱讀 4936

重兒子:重兒子是每個節點的兒子節點中子樹節點數最大的那乙個。

樹鏈刨分,把乙個樹砍成好多份變成乙個陣列p,p陣列裡存的是點的訪問到的順序,但是點的順序是根據什麼來的?先訪問重兒子,因為這樣可以盡可能多的一下找好長的鏈。

經典問題:1.給樹上兩個節點之間的最短邊上加上val;2.查詢兩點的最短距離;

用到好多陣列,解釋一下陣列的含義:

int p[maxn]

;//遍歷的順序 時間戳 或者說是位置 感覺主要用這個

int fp[maxn]

;//p的相反 fp[p[i]]=i;

int fa[maxn]

;//父節點

int dep[maxn]

;//深度

int son[maxn]

;//重兒子

int top[maxn]

;//這個重鏈的最頂端的頂點

int val[maxn]

;//點的權值

int num[maxn]

;//以當前節點為根的子樹的大小

int pos;

//計數用的 沒啥

(感覺用這個的時候就得用個什麼資料結構維護(線段樹?))

這是乙個樹刨加線段樹維護的題。。忘了是哪的了;忘求了(好像是洛谷的)

題意:幾種操作:

給兩點間經過的點權值都加val(包括這兩個點);

給乙個節點的子樹上的每個點都加上val(包括這個點);

查詢這個子樹上點的權值和;

查詢兩點的權值和;

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1e5+5;

int mod;

int p[maxn]

;int fp[maxn]

;int fa[maxn]

;int dep[maxn]

;int son[maxn]

;int l[maxn]

;int r[maxn]

;int top[maxn]

;int val[maxn]

;int num[maxn]

;int pos;

vector<

int> vv[maxn]

;struct node

node[maxn<<2]

;void

build

(int l,

int r,

int no)

int mid=l+r>>1;

build

(l,mid,no<<1)

;build

(mid+

1,r,no<<1|

1); node[no]

.num=

(node[no<<1]

.num+node[no<<1|

1].num)

%mod;

}void

down

(int no)

void

update

(int l,

int r,

int no,

int num)

if(node[no]

.tag)

down

(no)

;update

(l,r,no<<

1,num)

;update

(l,r,no<<1|

1,num)

; node[no]

.num=

(node[no<<1]

.num+node[no<<1|

1].num)

%mod;

}int

query

(int l,

int r,

int no)

void

dfs1

(int x,

int father,

int dp)

//預處理一些陣列}}

}void

dfs2

(int x,

int sp)

} r[x]

=pos;

}void

change

(int x,

int y,

int val)

update

(p[k]

,p[x],1

,val)

; x=fa[k]

; k=top[x];}

if(dep[x]

>dep[y]

)swap

(x,y)

;update

(p[x]

,p[y],1

,val);}

intgetans

(int x,

int y)

ans=

(ans+

query

(p[k]

,p[x],1

))%mod;

x=fa[k]

; k=top[x];}

if(dep[x]

>dep[y]

)swap

(x,y)

; ans=

(ans+

query

(p[x]

,p[y],1

))%mod;

return ans;

}int

main()

for(

int i=

1;i)dfs1

(root,0,

0);//printf("1\n");

dfs2

(root,root)

;//for (int i=1;i<=n;i++)

// printf("%d %d\n",l[i],r[i]);

build(1

,n,1);

while

(m--

)else

if(f==2)

else

if(f==3)

else

}}

Python 入個門(二)

python程式設計 從資料分析到資料科學 摘抄及拓展 5.3強型別語言 print 2 3 這種寫法是錯誤的,python不支援資料型別的自動轉化 print 3 true 45.8python中的關鍵字 使用模組keyword中的屬性kwlist檢視,這裡返回的是乙個列表。import keyw...

Python 入個門(三)

python程式設計 從資料分析到資料科學 摘抄及拓展 12.2 關於else的用法 a 1 3,5 7,2 4,6 8 b sorted a,reverse 0 reverse為0從小到大排序,預設值為0 print list b 1,2,3,4,5,6,7,8 print a 1,3,5,7,2...

bzoj3531 樹刨 線段樹動態開點

題意 一棵樹,每個點有顏色,4種操作,1.單點修改權值 2.單點修改顏色 3.查詢路徑顏色相同的點權和 4.查詢路徑顏色相同的點權最大值。思路 樹刨 線段樹動態開點,開1e5個線段樹。include using namespace std define ll long long define for...