樹鏈剖分經典板子題,但是需要注意的是線段樹既要維護和還要維護區間最大值。。。
第一次手搓還是很難。。感覺還是不太熟練。。。
以下是 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的路徑上的節點的權值和 注意 從點...