重兒子:重兒子是每個節點的兒子節點中子樹節點數最大的那乙個。
樹鏈刨分,把乙個樹砍成好多份變成乙個陣列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...