一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。
我們將以下面的形式來要求你對這棵樹完成一些操作:
i. change u t : 把結點u的權值改為t
ii. qmax u v: 詢問從點u到點v的路徑上的節點的最大權值
iii. qsum u v: 詢問從點u到點v的路徑上的節點的權值和
注意:從點u到點v的路徑上的節點包括u和v本身
輸入格式:
輸入檔案的第一行為乙個整數n,表示節點的個數。
接下來n – 1行,每行2個整數a和b,表示節點a和節點b之間有一條邊相連。
接下來一行n個整數,第i個整數wi表示節點i的權值。
接下來1行,為乙個整數q,表示操作的總數。
接下來q行,每行乙個操作,以「change u t」或者「qmax u v」或者「qsum u v」的形式給出。
輸出格式:
對於每個「qmax」或者「qsum」的操作,每行輸出乙個整數表示要求輸出的結果。
輸入樣例#1: 複製
41 22 3
4 14 2 1 3
12qmax 3 4
qmax 3 3
qmax 3 2
qmax 2 3
qsum 3 4
qsum 2 1
change 1 5
qmax 3 4
change 3 6
qmax 3 4
qmax 2 4
qsum 3 4
輸出樣例#1: 複製
41221065
6516
對於100%的資料,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到30000之間。
#include#include#include
#include
#include
using
namespace
std;
const
int n=3e4+5
;const
int inf=599518803
;int
n,m;
intopt,x,y;
intw[n],bound;
inthead[n],num_edge;
struct
edge
edge[n
<<1
];struct
node
node[n];
struct
tree
tree[n
<<2
];typedef tree*tree;
tree now_node=tree,root;
inline
intread()
inline
void add_edge(int u,int
v)void dfs1(intu)}
void dfs2(int u,int
top)
}node[u].t=bound;
}void build(tree &root,int l,int
r)void update(const tree &root,int pos,int
k)
if(pos<=root->mid)
update(root->lson,pos,k);
else
update(root->rson,pos,k);
root->sum=root->lson->sum+root->rson->sum;
root->maxn=max(root->lson->maxn,root->rson->maxn);
}int query_sum(const tree &root,int l,int
r)int query_max(const tree &root,int l,int
r)int query_sum(int x,int
y)
else
}if(node[x].dep>node[y].dep)
ans+=query_sum(root,node[y].s,node[x].s);
else
ans+=query_sum(root,node[x].s,node[y].s);
return
ans;
}inline
int query_max(int x,int
y)
else
}if(node[x].dep>node[y].dep)
ans=max(ans,query_max(root,node[y].s,node[x].s));
else
ans=max(ans,query_max(root,node[x].s,node[y].s));
return
ans;
}char s[10
];int
main()
for(int i=1;i<=n;++i)
w[i]=read();
dfs1(1);
dfs2(
1,1);
build(root,
1,n);
for(int i=1;i<=n;++i)
update(root,node[i].s,w[i]);
m=read();
while(m--)
else
if(s[1]=='m'
)
else
}return0;
}
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 樹的統計
樹鏈剖分經典板子題,但是需要注意的是線段樹既要維護和還要維護區間最大值。第一次手搓還是很難。感覺還是不太熟練。以下是 a c includeusing namespace std const int maxn 1e5 5 define ll long long int inline ll read ...
P2590 ZJOI2008 樹的統計
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...