Codeforces 697C Lorenzo Von Matterhorn(严格二叉树的LCA) - xgtao -
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 697C Lorenzo Von Matterhorn(严格二叉树的LCA) - xgtao -
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Lorenzo Von Matterhorn
?
給出一棵二叉樹,節點i與2*i和2*i+1相連,i的范圍是1~10^18,每一條邊有一個權值w(0~10^9),給出q(1~1000)個操作,操作有兩種,1:將u-v所有邊的權值加上w。2:詢問u-v所有邊的總的權值。
?
首先分析u-v,這使我們很容易想到LCA,但是數據范圍太大,所以利用二叉樹的性質:i的父親為(i>>1),再加上LCA的思想,就可以做出框架,但還是由于數據范圍太大,所以只能用map儲存各個邊的值(map[i]表示i-(i>>1)的值)。
?
?
#include <iostream> #include <cstdio> #include <algorithm> #include <map> #define LL long long using namespace std; map<LL,LL>s; LL u,v,w; void update(LL u,LL v,LL w){while(u != v){if(u > v){s[u] += w;u >>= 1;}if(u < v){s[v] += w;v >>= 1;}} }LL query(LL u,LL v){LL res = 0;while(u != v){if(u > v){res += s[u];u >>= 1;}if(u < v){res += s[v];v >>= 1;}}return res; }int main(){int q,op;scanf("%d",&q);for(int i = 1;i <= q;++i){cin>>op>>u>>v;if(op == 1){cin>>w;update(u,v,w);}else{cout<<query(u,v)<<endl;}}return 0; }
?
轉載于:https://www.cnblogs.com/xgtao984/p/5680186.html
總結
以上是生活随笔為你收集整理的Codeforces 697C Lorenzo Von Matterhorn(严格二叉树的LCA) - xgtao -的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是堆栈?
- 下一篇: HTML5学习笔记(一):HTML简介