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;
} } } }

最新文章

  1. ghost xp 安装IIS,并配置WCF
  2. Adobe AIR and Flex - 实现堆栈容器
  3. 算法系列1《DES》
  4. (转)Redis复制与可扩展集群搭建
  5. linux ssh 安装、安全设置
  6. 李洪强漫谈iOS开发[C语言-012]-C语言基本数据类型
  7. Redis 和 Memcached 的区别详解
  8. MYSQL 缓存详解 [myownstars] 经典博客
  9. DELL磁盘阵列控制卡(RAID卡)MegaCli常用管理命令汇总
  10. 几个DOM属性
  11. oracle dataguard 角色切换
  12. 汇编条件判断整理(JCC,CMP/TEST的实现)
  13. JSON对象长度和遍历方法(转)
  14. 使用curl上传报错问题排查
  15. Nginx http 500错误分析及解决方法
  16. windows 系统下C++实现的多线程
  17. sigmoid_cross_entropy_with_logits
  18. 【easy】561. Array Partition I
  19. 068 mapWithState函数的讲解
  20. HAProxy(三):Keeplived+HAProxy搭建高可用负载均衡动静分离架构基础配置示例

热门文章

  1. F - Rescue 优先队列bfs
  2. poj 3304
  3. 17.vue移动端项目二
  4. ELK之使用filebeat收集系统数据及其他程序并生成可视化图表
  5. springboot:spring data jpa介绍
  6. IntelliJ IDEA 下的svn配置及使用
  7. MAC OS X&amp;Vmware
  8. 小程序movable-area置于顶层遮盖下方元素无法操作的解决方案
  9. MySQL Backup mysqldump备份流程学习
  10. redis示例 - 限速器,计时器