Codeforces 697C

本文介绍了一个关于完全二叉树的问题,通过两种操作(修改路径上的节点权值和查询路径权值和)来更新和获取节点信息。利用位运算进行高效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:http://codeforces.com/problemset/problem/696/A

题意:给了一棵完全二叉树,树的每个结点权值1-1e18,两种操作。对于1操作,给了结点u,v,和权值w,从u到v的最短路径上所有的分支都加上这个权值,对于2操作,给了结点u,v,查询u到v的最短路径的分支权值和。

分析:对于两个结点,只要它们沿着根结点向上找就行,小的结点等到大的结点直到和它在一层,最后两个结点重合为止。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<ll,ll>ma;
void add(ll x,ll y,ll z)
{
    while(x != y)
    {
        if(x > y)
        {
            ma[x] += z;
            x >>= 1;
        }
        else
        {
            ma[y] += z;
            y >>= 1;
        }
    }
}
ll sum(ll x,ll y)
{
    ll res = 0;
    while(x != y)
    {
        if(x > y)
        {
            res += ma[x];
            x >>= 1;
        }
        else
        {
            res += ma[y];
            y >>= 1;
        }
    }
    return res;
}
int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int x;
        cin>>x;
        if(x == 1)
        {
            ll u,v,w;
            cin>>u>>v>>w;
            add(u,v,w);
        }
        else
        {
            ll u,v;
            cin>>u>>v;
            cout<<sum(u,v)<<endl;
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值