您的位置:首页 > 其它

Codeforces 696A. Lorenzo Von Matterhorn(map离散化)

2016-07-16 16:38 417 查看
题目链接

简单题意

给出一颗二叉树,边权初始为0,和一些询问,询问有两种操作:

一是把u到v最短路上的所有边增加w的权值;

二是询问u到v最短路上的权值和。

思路

因为是二叉树,所以u到v的最短路肯定就是两点到LCA的路,直接暴力搞就好,但是因为节点数有1e18,数组开不下,所以用map保存。

代码

#include <bits/stdc++.h>
using namespace std;
map<long long,long long > M;
int main (){
int T;
cin >>T;
while(T --){
int opt;
long long u,v,cost;
scanf("%d %I64d %I64d",&opt,&u,&v);
if(opt == 1){
scanf("%I64d",&cost);
if(u < v) swap(u,v);
while(u != v){
while(u>v) {M[u] += cost;u/=2;}
while(v>u) {M[v] += cost;v/=2;}
}
}
if(opt == 2){
if(u < v) swap(u,v);
long long ans = 0;
while(u != v){
while(u>v) {ans += M[u];u/=2;}
while(v>u) {ans += M[v];v/=2;}
}
printf("%I64d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: