P2590 ZJOI2008 樹的統計

2021-09-10 09:32:18 字數 1331 閱讀 5108

樹鏈剖分經典板子題,但是需要注意的是線段樹既要維護和還要維護區間最大值。。。

第一次手搓還是很難。。感覺還是不太熟練。。。

以下是 a c** 

#includeusing namespace std;

const int maxn = 1e5+5;

#define ll long long int

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}#define ls k<<1,l,mid

#define rs k<<1|1,mid+1,r

#define root 1,1,n

ll v[maxn<<2];

ll n,m;

int head[maxn],tot;

struct node

ed[maxn];

void add(int a,int b)

ll top[maxn],pos[maxn],dep[maxn];

ll sz[maxn],fa[maxn],son[maxn];

int id;

void dfs(int x)

}void dfss(int x,int p)

}ll num[maxn<<2],mxx[maxn<<2];

void pb(int k)

void update(int k,int l,int r,int id,ll v)

int mid = (l+r)>>1;

if(id <= mid)update(ls,id,v);

else update(rs,id,v);

pb(k);

}ll sum(int k,int l,int r,int s,int e)

ll mxv(int k,int l,int r,int s,int e)

ll query_sum(ll x, ll y)

if(dep[x] < dep[y]) swap(x, y);

ans += sum(root, pos[y], pos[x]);

return ans;

}ll query_max(ll x, ll y)

if(dep[x] < dep[y]) swap(x, y);

ans = max(ans, mxv(root, pos[y], pos[x]));

return ans;

}int main()

if(st[1] == 's')

if(st[1] == 'h')

}return 0;

}

P2590 ZJOI2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...

P2590 ZJOI2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...

P2590 ZJOI2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...