樹剖裸題 BZOJ1036 樹的統計

2022-05-31 17:39:10 字數 1848 閱讀 7706

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