1 #include2 #include3 #include4 #include5#define foru(i,x,y) for(int i=x;i<=y;i++)
6#define clr(a) memset(a,0,sizeof(a))
7using
namespace
std;
8const
int n=100010;9
struct edgee[n*2
];10
struct nodet[10*n];
11int
d[n],id[n],head[n],f[n],siz[n],son[n],top[n];
12//
f[v] 節點v的父節點編號
13//
14//
siz[v] 以節點v為根的數中的節點數
15//
son[v] 節點v的子節點中siz最大的節點編號
16//
top[v] 節點v所在重鏈的頂端節點編號
17//
d[v] 節點v的深度
18int
ne,cnt,n;
1920
void add(int a,int
b);head[a]=ne;22}
23void dfs(int k,int fa,int dep)33}
3435
void build(int k,int
tp)43}44
45#define mid ((l+r)>>1)
46#define ls (k<<1)//
寫位運算一定要開-wall,否則一定要記得加括號
47#define rs ls+1
4849
void update(int k,int l,int r,int p,int
x)52 update(ls,l,mid,p,x); update(rs,mid+1
,r,p,x);
53 t[k].m=max(t[ls].m,t[rs].m);
54 t[k].s=t[ls].s+t[rs].s;55}
5657
int querym(int k,int l,int r,int l,int
r)62
63int querys(int k,int l,int r,int l,int
r)68
69int findm(int x,int
y)76
if(d[x]>d[y])swap(x,y);//
當兩點處於同一條鏈上的時候,進行最後一次統計
77 ans=max(ans,querym(1,1
,cnt,id[x],id[y]));
78return
ans;79}
8081
int finds(int x,int
y)88
if(d[x]>d[y])swap(x,y);
89 ans+=querys(1,1
,cnt,id[x],id[y]);
90return
ans;91}
92char ch[20
];93
intmain()
100 dfs(1,0,1
);101 build(1,1
);102 foru(i,1
,n)106 scanf("
%d",&u);
107while(u--)
114}
115return0;
116 }
BZOJ 1036 樹的統計 Count 樹鏈剖分
題目大意 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 ...
樹鏈剖分 線段樹 bzoj1036 樹的統計
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...
bzoj1036 樹的統計 樹鏈剖分 LCT
ac通道 題解 看到題目,發現是樹剖一眼題,所以就秒掉了。include include include include include include includeusing namespace std typedef long long ll define file read define m...