[FZYZOJ 1247] RP堆
2015-06-05 22:06
351 查看
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
3 1 2 3
Sample Output
2
Hint
Data Limit对于30%的数据,保证有Q <= 10000;
对于全部的数据,保证有Q <= 200000。
【题解】
其实这就是二叉树啊,树上节点求距离,水过。
数据有点大,0.95s,加输入优化卡过了时间。
#include<bits/stdc++.h> using namespace std; int read() { int x=0; int f=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } int main() { int n=read(),q=read(),a,b,ans=0; for (int i=1;i<=q;i++,ans=0) { int x=read(),y=read(); while(x!=y) { while(x>y) x>>=1,ans++; while(x<y) y>>=1,ans++; } printf("%d\n",ans); } return 0; }
View Code
相关文章推荐
- Java知多少(83)面板基础:JPanel和JScrollPane
- Aspose Cells如何进行数据验证(后附下载地址)
- 黑马程序员_@protocol 协议
- Android 后台Service : 向服务器发送心跳包
- 利用钥匙串,在应用里保存用户密码的方法
- 随机数 作业
- php本地文件上传到远程服务器
- 线程间通讯和等待唤醒机制
- 设置linux静态IP
- Preparing Olympiad
- Linux 压缩与解压缩相关
- 《软件调试艺术》读后感二
- 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中
- VS2013Z学习java插件
- poj 3468 A Simple Problem with Integers(线段树区间更新)
- MacOS copy图标shell脚本
- ViewPager,Bundle,类的解析
- Android自定义View学习笔记04
- 程序员的自我修养:(1)目标文件
- leetcode 21 Merge Two Sorted Lists