【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)
题干:
巴尼住在NYC。NYC具有从1开始的正整数编号的无数个交叉点。在交叉点 i 和 2i 之间以及 i和 2i + 1 之间存在双向道路,对任意整数 i 都满足。在任意两点之间都有且只有一条最短路。
最初任何人都可以通过任何道路免费。 但是后来发生了 q 个事件。 有两种类型的事件:
1. 政府制定新规。 一个规则可以用三个整数表示 v, u 和 w。经过这次操作,点 u 到点 v 路径上的所有点增加 w 元路费。
2. 巴尼从点 v 通过最短路移动到点 u。
现巴尼想知道,他的每一次移动需要花多少钱
Input
第一行包含一个整数 q (1 ≤ q ≤ 1 000).
之后 q 行,每行包含一个事件。加路费的事件都被描述成 1 v u w ,代表将点 u 到点 v 路径上所有点路费增加 w 元。移动的事件都被描述成 2 v u,表示巴尼从点 v 走到点 u.
1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109。
Output
对于第二类的每个事件,打印Barney在此事件中通过的所有道路的通行费的总和,一行。 以相应事件的时间顺序打印答案。
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:
- Intersections on the path are 3, 1, 2 and 4.
- Intersections on the path are 4, 2 and 1.
- Intersections on the path are only 3 and 6.
- 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.
- Intersections on the path are 6, 3 and 1.
- Intersections on the path are 3 and 7. Passing fee of the road between them is 0.
- 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).
解题报告:
注意到i,2i与 i,2i+1的搭配,考虑二叉树。因为最大的值是1e18,所以层数一定不会很多(最多也就60层吧?)所以对于更新和查询均可以暴力。用点权代表他和父节点的边权,一维map就可以解决。(二维map也可以,但是因为孩子节点的父节点是唯一的,所以孩子节点就可以当做这条边的特征元)
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
map<ll,ll> mp;
void add(ll u,ll v,ll w) {while(u!=v) {if(u>v) mp[u] += w,u /= 2;else mp[v] += w,v /= 2;}
}
ll sum(ll u,ll v) {ll res = 0;while(u!=v) {if(u>v) res += mp[u],u /= 2;else res += mp[v],v /= 2;}return res;
}
int main()
{int q,op;ll u,v,w;cin>>q;while(q--) {scanf("%d",&op);if(op == 1) {scanf("%lld%lld%lld",&u,&v,&w);add(u,v,w);}else {scanf("%lld%lld",&u,&v);printf("%lld\n",sum(u,v));}}return 0 ;
}
【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)相关推荐
- 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)个操作,操作有两种, ...
- cf#362-C. Lorenzo Von Matterhorn
http://codeforces.com/contest/697/problem/C 给你一个完全二叉树 两个操作 1: u,v,w 把u到v上的路都加w权值 2:u,v 查询u到v的权值和 uv ...
- 数据结构-树与二叉树-思维导图+小结
数据结构-树与二叉树-思维导图 1 数据结构-第五章-树与二叉树-思维导图 2 思维导图-补充 3 小结 3.1 知识点小结 3.2 习题小结 1 数据结构-第五章-树与二叉树-思维导图 数据结构 ...
- Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...
- codeforces 148 C. Terse princess(思维,构造)
C. Terse princess(思维,构造) 题目链接:codeforces 148C 题意: 有个公主找王子,如果这个人比之前所有王子的财富都高,公主就会Oh, ...
- CodeForces - 1498D Bananas in a Microwave(思维+dp)
题目链接:点击查看 题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 txyt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]n ...
- CodeForces - 813E Army Creation(主席树+思维)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列和一个整数 kkk,现在有 qqq 次询问,每次询问给出一个区间 [l,r][l,r][l,r],设 cnticnt_icnti 为数字 ...
- CodeForces - 1030C Vasya and Golden Ticket(思维)
题目链接:点击查看 题目大意:给定长度为n的字符串,字符串全部由0~9的数字组成,要求将字符串划分为连续的子字符串,要求每个子字符串的和都要相等,问给定字符串能否成功划分 题目分析:简单思维,因为划分 ...
- CodeForces - 1245A Good ol' Numbers Coloring (思维)
Codeforces Round #597 (Div. 2 Consider the set of all nonnegative integers: 0,1,2,-. Given two integ ...
最新文章
- Windows 10 RedStone2值得期待的五大功能猜想
- css之px自动转rem—sublime 插件CSSREM
- MySql 中文乱码排查解决方案
- 【限时免费报名】MongoDB原厂和阿里专家喊你来训练营上课啦!
- java解析xml的几种方式
- Spring5参考指南:依赖注入
- (转)用JS实现表格中隔行显示不同颜色
- 坯子库曲面推拉教程_一招曲面流动,搞定99%异形建模
- conda创建虚拟环境,拥有多个Anconda版本
- ubuntu server执行sudo出现no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory...
- PHP正则匹配Html内容,并通过浏览器弹框下载Excel
- HTML和JavaScript学习笔记
- 雪球网基于沪深300的评论爬虫
- 卡牌游戏算法原理、代码
- 使用Telnet连接smtp服务器发送邮件
- 会编程的少年有多厉害?8岁女儿写代码哄程序员爸爸开心,网友直呼:破防了
- H5页面自适应各种手机端屏幕分辨率的大小
- 前端使用滑块滑动进行验证的思路
- 服务器绑定自己的域名-腾讯云
- 树莓linux pi密码,树莓派 忘记密码的解决方法
热门文章
- hdu4353 Finding Mine三角形内的点数
- 【小技巧】字符char与整型int的相互转换
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第5篇]复杂性类NP是什么意思?
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第50篇]什么是BLS基于Weil对的签名方案?
- php http请求xml数据,使用php从HTTP POST请求中检索XML
- mysql分库一致性_分库分表带来的完整性和一致性问题
- mysql两个表查询修改_MySQL:查询、修改(二)
- 2021年河南高考成绩排名查询一分一段表,2018河南高考一分一段统计表,查排名必备!...
- AD16画线时如何切换90°、45°、任意角度画线模式
- rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列