2018-03-16

http://codeforces.com/problemset/problem/697/C

C. Lorenzo Von Matterhorn
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Barney lives in NYC. NYC has infinite number of intersections numbered with positive integers starting from 1. There exists a bidirectional road between intersections i and 2i and another road between i and 2i + 1 for every positive integer i. You can clearly see that there exists a unique shortest path between any two intersections.

Initially anyone can pass any road for free. But since SlapsGiving is ahead of us, there will q consecutive events happen soon. There are two types of events:

1. Government makes a new rule. A rule can be denoted by integers v, u and w. As the result of this action, the passing fee of all roads on the shortest path from u to v increases by w dollars.

2. Barney starts moving from some intersection v and goes to intersection u where there's a girl he wants to cuddle (using his fake name Lorenzo Von Matterhorn). He always uses the shortest path (visiting minimum number of intersections or roads) between two intersections.

Government needs your calculations. For each time Barney goes to cuddle a girl, you need to tell the government how much money he should pay (sum of passing fee of all roads he passes).

Input

The first line of input contains a single integer q (1 ≤ q ≤ 1 000).

The next q lines contain the information about the events in chronological order. Each event is described in form 1 v u w if it's an event when government makes a new rule about increasing the passing fee of all roads on the shortest path from u to v by w dollars, or in form 2 v u if it's an event when Barnie goes to cuddle from the intersection v to the intersection u.

1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109 states for every description line.

Output

For each event of second type print the sum of passing fee of all roads Barney passes in this event, in one line. Print the answers in chronological order of corresponding events.

Example
Input

 
7
1 3 4 30
1 4 1 2
1 3 6 8
2 4 3
1 6 1 40
2 3 7
2 2 4
Output
94
0
32
Note

In the example testcase:

Here are the intersections used:

  1. Intersections on the path are 3, 1, 2 and 4.
  2. Intersections on the path are 4, 2 and 1.
  3. Intersections on the path are only 3 and 6.
  4. Intersections on the path are 4, 2, 1 and 3. Passing fee of roads on the path are 32, 32 and 30 in order. So answer equals to 32 + 32 + 30 = 94.
  5. Intersections on the path are 6, 3 and 1.
  6. Intersections on the path are 3 and 7. Passing fee of the road between them is 0.
  7. Intersections on the path are 2 and 4. Passing fee of the road between them is 32 (increased by 30 in the first event and by 2 in the second).

#LCA详解

#map详解

题意:先给出q次操作,当输入1的时候,表示一棵完全二叉树的两个节点u、v之间最短路径的权值全部加上w,当输入2的时候,表示询问这棵树的u到v节点间最短路径的权值之和。

解析:一棵二叉树!从任意一个点出发往上爬最多只要64步就能爬到顶点了,可以暴力。然后就是LCA思想。存入权值和计算最短路径的权值一样思路。为什么map?因为数值很大,不能用数组存,所以一边建点一边存入权值(加到对应一对点中较大点的map上)。

复杂度:O(q*log(n)*log(n))其中map的复杂度是log(n)

Code:

 #include<string.h>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<map> //map
using namespace std;
#define MAX 0x3f3f3f3f
#define fi first
#define se second
#define ll long long map < ll,ll > mp; //map 因为数据太大了,不能使用数组 int main()
{
int q;
ll t,v,u,w;
while(cin>>q)
{ for(int i=;i<=q;i++)
{
/*cin>>t>>v>>u>>w;*/
cin>>t;
if(t==)
{
cin>>v>>u>>w;
while(v!=u)
{
if(v < u)
{
swap(v,u);
} mp[v]+=w;
v/=; //这个点一定是从它的/2过来的
}
}
else
{
cin>>v>>u;
ll ans=;
while(v!=u)
{
if(v<u)
{
swap(v,u);
}
ans+=mp[v];
v/=;
}
cout<<ans<<endl;
} } } }

#map+LCA# Codeforces Round #362 (Div. 2)-C. Lorenzo Von Matterhorn的更多相关文章

  1. Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn (类似LCA)

    题目链接:http://codeforces.com/problemset/problem/697/D 给你一个有规则的二叉树,大概有1e18个点. 有两种操作:1操作是将u到v上的路径加上w,2操作 ...

  2. Codeforces Round #362 (Div. 2) A.B.C

    A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. Codeforces Round #362 (Div. 2)

    闲来无事一套CF啊,我觉得这几个题还是有套路的,但是很明显,这个题并不难 A. Pineapple Incident time limit per test 1 second memory limit ...

  4. 【转载】【树形DP】【数学期望】Codeforces Round #362 (Div. 2) D.Puzzles

    期望计算的套路: 1.定义:算出所有测试值的和,除以测试次数. 2.定义:算出所有值出现的概率与其乘积之和. 3.用前一步的期望,加上两者的期望距离,递推出来. 题意: 一个树,dfs遍历子树的顺序是 ...

  5. Codeforces Round #362 (Div. 2) D. Puzzles

    D. Puzzles time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  6. Codeforces Round #362 (Div. 2)->B. Barnicle

    B. Barnicle time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  7. Codeforces Round #362 (Div. 2)->A. Pineapple Incident

    A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. Codeforces Round #362 (Div. 2) B 模拟

    B. Barnicle time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  9. Codeforces Round #362 (Div. 2) A 水也挂

    A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...

随机推荐

  1. Ice_cream's world I(并查集成环)

    Problem Description ice_cream's world is a rich country, it has many fertile lands. Today, the queen ...

  2. day14 十四、三元运算符,推导式,匿名内置函数

    一.三元(目)运算符 1.就是if...else...语法糖 前提:if和else只有一条语句 # 原来的做法 cmd = input('cmd:>>>') if cmd.isdig ...

  3. 20175320 2018-2019-2 《Java程序设计》第4周学习总结

    20175320 2018-2019-2 <Java程序设计>第4周学习总结 教材学习内容总结 本周学习了教材的第五章的内容.在这章中介绍了子类与继承,着重讲了子类继承的规则以及使用sup ...

  4. Vijos 1360 - 八数码问题 - [A*]

    题目链接:https://vijos.org/p/1360 优先队列BFS: 这个八数码问题本身其实是之前人工智能实验课的作业…… 首先,如果不带估价函数,直接用优先队列BFS,肯定也是能得到正确结果 ...

  5. js之常见问题--for循环中为什么点击总是弹出最后一个i

    首先看看点击不同li标签时,弹出li的索引值对应的结果 HTML: <ul> <li>0</li> <li>2</li> <li> ...

  6. VBA语法总结

    为了控制Excel,学了些VBA,总结下语法,下文分为五部分: 一.代码组织 二.常用数据类型 三.运算符 四.控制流 五.常用内置函数 一.代码组织 1.能写代码的地方有{模块,类模块}. 2.代码 ...

  7. Spark application注册master机制

    直接上Master类的代码: case RegisterApplication(description) => { if (state == RecoveryState.STANDBY) { / ...

  8. drawrect&layoutsubviews

    drawrect触发方法: 设置frame setneeddisplay contentmode设置为redraw sizetofit layoutsubviews触发方法 setframe layo ...

  9. pandas的Panel类型dtype

    panel = pd.Panel(dataframe_dict) 把一个多列类型不相同(里面有int,float)的dataframe字典直接赋值给Panel,从Panel中解析出来的datafram ...

  10. JedisCluster简单使用

    项目中因为一些原因需要用到缓存,之前没有接触过,在此做一些简单的使用记录. 1.jedis在项目中依赖 <dependency> <groupId>redis.clients& ...