题目分析
本题题意为在一颗二叉树中,可以有一种操作和一种查询,操作为将给定u和v之间的那条唯一路径每条边加权值w;查询为输出u和v之间的路径的权值和。
看了大神的代码,本题只需要在求lca(最近公共祖先)时顺便更新一下与节点直接相连的上方的边的权值。然后用到神器map,第一次用,果然神器!
另外要注意unordered_map虽然快,但是是c++11才有的。
代码
#include <iostream>
#include <map>
#define int long long
using namespace std;
map<int,int> mp;
int lca(int v, int u, int w=0){
if(u==v)
return 0;
if(u<v)
swap(u,v);
mp[u]+=w;
return lca(v,u/2,w) + mp[u];
}
int main(){
int q;
cin>>q;
while(q--){
int op;
cin>>op;
if(op==1){
int v,u,w;
cin>>v>>u>>w;
lca(v,u,w);
}
else{
int v, u;
cin>>v>>u;
cout<<lca(u,v)<<endl;
}
}