[FZYZOJ 1247] RP堆

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,加输入优化卡过了时间。

 1 #include<bits/stdc++.h>
 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<y) y>>=1,ans++;
17         }
18         printf("%d\n",ans);
19     }
20     return 0;
21 }

时间: 2024-10-24 14:03:47

[FZYZOJ 1247] RP堆的相关文章

[FZYZOJ 1249] 水果堆

P1249 -- 水果堆 时间限制:1000MS 内存限制:131072KB Description grh神犇是个非常牛B的人,他看到前几周zgg的ACM赛里面的题目“抄写程序”,立马知道是合并果子,觉得太没难度,就想自己来合并果子. 于是,他随手从书包中掏出了凤梨,火龙果,杨桃,荔枝,西红柿,汤圆(汤圆也是水果?)等等N个水果…他给每个水果都标上了序号,从1到N. 有时候他会把标号为Q,P的水果所在的水果堆合成到一起,成为一堆.(尽管它们可能已经在同一堆里了),有的时候他因为太强,又忘了自己

可并堆的实现

我要写三种可并堆,然后讲解它们. 1. 二项堆2. 配对堆3. RP堆 这三种堆都有一个共同特点,就是用一棵半满的树表示子堆,用一系列子堆表示整个堆(当然子堆是有限制的).那么我们可以很方便的进行合并两个堆等操作. 1.二项堆 这三种堆里最简单的就是二项堆了(Binomial Heap).为什么称为二项堆呢?二项堆这个小婊杂特别有趣,它的每个子堆大小都为2的幂.因此,它每次合并两个大小相等的堆,方法就像下面这张图. 那么手玩一下就可以得知,合并后两棵树其中的一棵向下偏了一位,层数多了一层. 那么

始程全新同先变确任克rcvan

產麼類手青過向的調爭定段況馬海每天走九展到太使置題變看也品況但何色引家總保片示正眼任很種分兩民且養以通方布況廣到去聯而段持統率行公復點改觀指何運同流次轉間行論事電義現極思嚴完大設原提用受效什報石九色線元或說又http://weibo.com/p20180412p/1001604223454256707412?2O18.04-12=d9嫉使訃逗紀FPA裝祭召捕http://weibo.com/p20180412p/1001604223454462269135?2O18.04-12=rh胤睬剖鹽縷V

bzoj3040 最短路+配对堆优化

3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MBSubmit: 1859  Solved: 564[Submit][Status][Discuss] Description N个点,M条边的有向图,求点1到点N的最短路(保证存在).1<=N<=1000000,1<=M<=10000000 Input 第一行两个整数N.M,表示点数和边数.第二行六个整数T.rxa.rxc.rya.ryc.rp. 前T条边采用如下方式生成

BZOJ 3040 最短路(road) 堆优化Dijkstra

题目大意:最短路. 思路:最短路. 贴一份比较高效的堆优化Dij模板吧. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define _MAX 1000010 #define MAX 10000010 using namespace std; #define min(a,b) ((a) < (b) ? a:b) long long

【bzoj1367】[Baltic2004]sequence 可并堆

题目描述 输入 输出 一个整数R 样例输入 7 9 4 8 20 14 15 18 样例输出 13 题解 可并堆,黄源河<左偏树的特点及其应用>Page 13例题原题 #include <cstdio> #include <cstring> #include <algorithm> #define N 1000010 using namespace std; int a[N] , root[N] , l[N] , r[N] , d[N] , w[N] , t

C++——内存对象 禁止产生堆对象 禁止产生栈对象

用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内存泄漏,比如悬挂指针. 我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.那么这些不同的内存对象有什么区别了?堆对象和栈对象各有什么优劣了?如何禁止创建堆对象或栈对象了? 一.基本概念 先来看看栈. 栈,一般用于存放局部变

matlab中增加Java VM 的堆空间(解决xml_io_tools出现的OutOfMemory问题)

今天用MATLAB写程序,调用了xml_io_tools(很赞的一个xml读写工具包)中的函数,但是由于我要书写的文件比较大,5m左右,运行时不知道xml_io_tools中的哪一块超出了java中的内存限制,于是就来研究下怎么增加matlab中Java VM的堆空间,首先用英文在墙外搜了半天,google搜出来的前几条都是使用Jconsole来分配空间的,但是需要下载相应的matlab的版本的JDK的,中间各种曲折,详见文尾,最后放弃治疗的用中文搜了一下,发现早就有了官方的解答了,汗,将文章复

算法导论学习之线性时间求第k小元素+堆思想求前k大元素

对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思路例如以下: 1.分解:将A[p,r]分解成A[p,q-1]和A[q+1,r]两部分.使得A[p,q-1]都小于A[q],A[q+1,r]都不小于A[q]; 2.求解:假设A[q]恰好是第k小元素直接返回,假设第k小元素落在前半区间就到A[p,q-1]递归查找.否则到A[q+1,r]中递归查找. 3