博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[FZYZOJ 1247] RP堆
阅读量:5335 次
发布时间:2019-06-15

本文共 1293 字,大约阅读时间需要 4 分钟。

P1247 -- RP堆

时间限制:1000MS

内存限制:131072KB

Description

众所周知,zgg天天DR,所以他总是无私地将体内的RP贡献给别人。

但是我们都想知道一个问题,就是为什么能飞使终能保持体内的RP平衡与超高的RP值呢。

原来,zgg体内的RP有一种特殊的存储方式,不同于我们一般人的随机分布,存取困难。

他体内有一个稳定的RP堆,他将各个RP分子从1到N编号,根节点的编号为1,如果某个RP分子X不是叶子节点,那么它的左儿子为RP分子2X,右儿子为RP分子2X+1。

这样一来,zgg每次DR时只需要将指定的两个RP分子结合就能以最小的RP损耗输出高额RP。注意zgg每次DR后体内RP会很快恢复平衡,以便保持下一次DR的状态。

注意DR时的RP损耗是那两个RP分子间的最短距离。

Input Format

输入第一行是一个整数N(2 <= N <= 100000000),表示RP分子个数。第二行有一个整数Q,一下Q行每行两个整数X,Y表示zgg将编号为X,Y的RP分子结合。

Output Format

输出包括Q行,每行只包含一个整数,就是DR时的RP损耗。

Sample Input

312 3

Sample Output

2

Hint

Data Limit

对于30%的数据,保证有Q <= 10000;

对于全部的数据,保证有Q <= 200000。

 

【题解】

其实这就是二叉树啊,树上节点求距离,水过。

数据有点大,0.95s,加输入优化卡过了时间。

1 #include
2 using namespace std; 3 int read() { 4 int x=0; int f=1; 5 char ch=getchar(); 6 while(ch<'0'||ch>'9') {
if(ch=='-') f=-1; ch=getchar();} 7 while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} 8 return x*f; 9 }10 int main() {11 int n=read(),q=read(),a,b,ans=0;12 for (int i=1;i<=q;i++,ans=0) {13 int x=read(),y=read();14 while(x!=y) {15 while(x>y) x>>=1,ans++;16 while(x
>=1,ans++;17 }18 printf("%d\n",ans);19 }20 return 0;21 }
View Code

 

转载于:https://www.cnblogs.com/TonyNeal/p/fzyzoj1247.html

你可能感兴趣的文章
#10015 灯泡(无向图连通性+二分)
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
c#的const可以用于引用类型吗
查看>>
手动实现二值化
查看>>
What Linux bind mounts are really doing
查看>>
linux top命令详解
查看>>
博弈论小结
查看>>
模拟Post登陆带验证码的网站
查看>>
NYOJ458 - 小光棍数
查看>>
java中常用方法
查看>>
【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
查看>>
canvas动画
查看>>