题意:
给出一棵二叉树,结点i和结点2*i,2*i+1相连,q次操作
操作1:将u->v路径上的权值加上c
操作2:询问u->v路径上权值和
分析:
乍一看以为是什么高级数据结构,然而仔细分析以下题目,其实并不是,根据二叉树的特性,结点i除以2就可以得到它的父节点,那么每次操作只需要u和v除2一直到u=v就能够得到这条路径,在路径上记录权值就不成问题了,由于结点范围较大,所以我用的map存
#include<cstring>
#include<string>
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstdlib>
#include<cmath>
#include<vector>
//#pragma comment(linker, "/STACK:1024000000,1024000000");
using namespace std;
#define INF 0x3f3f3f3f
map<long long ,long long>mp;
int main()
{
int t;
cin>>t;
while(t--)
{
int op;
cin>>op;
if(op==1)
{
long long a,b,c;
cin>>a>>b>>c;
while(a!=b)
{
if(a<b) swap(a,b);
mp[a]+=c;
a/=2;
}
}
else
{
long long a,b,ans=0;
cin>>a>>b;
while(a!=b)
{
if(a<b) swap(a,b);
ans+=mp[a];
a/=2;
}
cout<<ans<<endl;
}
}
return 0;
}

本文介绍了一种针对二叉树路径的操作算法,利用结点的特性实现路径更新与查询功能,通过递归除2的方法找到从结点u到结点v的路径,并在路径上进行加权操作或查询路径权值总和。

431

被折叠的 条评论
为什么被折叠?



