题解概述

从查询位逆向跳跃,回溯至构造前的起始跳转位,即可推导出起始跳转位所对应的数字值,操作时间复杂度为 O ( q l o g ( n ) ) O(qlog(n)) O(qlog(n)).


读者不难达成以下共识

  1. 在构造过程中,序列的前半部分数字将会保持原位不动

  2. 当有 n n n个数字时,初始序列共有 n − 1 n-1 n−1个空位,因此总共需要 n − 1 n-1 n−1次移动操作才能完成最终序列构造,即填满空位;

  3. 在构造过程中,第 i i i次操作的移动距离也为 i i i

  4. 在构造过程中,一个独特数字的首次操作移动距离总是奇数

  5. 一个独特数字的下一次移动距离会翻倍

由上述共识可得,无需推演全部构造过程,即可用 O ( l o g n ) O(logn) O(logn)的复杂度推出某一个数字的最终位置。


利用上述共识可逆向迭代回溯出查询位所对应的起始数字值

首先易得,奇数查询位 的对应值为 ⌊ x 2 ⌋ + 1 \lfloor\frac{x}{2}\rfloor + 1 ⌊2x​⌋+1 (见共识0) .

下面为 偶数查询位 的推导步骤:

  1. 查询位 x x x的左侧有 ⌊ x 2 ⌋ − 1 \lfloor\frac{x}{2}\rfloor - 1 ⌊2x​⌋−1个初始填充空位;

  2. 由于共有 n − 1 n-1 n−1次移动操作,查询位 x x x末次移动为第 ( n − 1 ) − ( ⌊ x 2 ⌋ − 1 ) (n-1) - (\lfloor\frac{x}{2}\rfloor - 1) (n−1)−(⌊2x​⌋−1)次移动移动距离自然也是 ( n − 1 ) − ( ⌊ x 2 ⌋ − 1 ) (n-1) - (\lfloor\frac{x}{2}\rfloor - 1) (n−1)−(⌊2x​⌋−1) (见共识2,第 i i i次操作的移动距离也为 i i i)

  3. 由共识3,4可得,每次移动距离的上一次移动距离会减半,直至移动距离为奇数(首次移动),设2中的末次移动距离为 l e n len len,我们可通过迭代 l e n / = 2 len /= 2 len/=2向右回推求解起始位,直至 l e n len len为奇数,设推出查询位 x x x的起始位置为 p o s pos pos;

  4. 构造前起始 p o s pos pos位的对应值为 ⌊ p o s 2 ⌋ + 1 \lfloor\frac{pos}{2}\rfloor + 1 ⌊2pos​⌋+1.


逆向迭代递推代码如下(附正向构造过程代码):

/*Backtracking code for construction
*/#include <iostream>
using namespace std;int main()
{long long int n, q;cin >> n >> q;long long mid = (n+1) / 2;for (int i = 0; i < q; i ++){long long int x;cin >> x;if (x % 2 == 1){cout << x / 2 + 1 << endl;continue;}// (n - 1) == tot empty cells number, or tot moves// (x/2 - 1) == pre empty cells numberlong long int firstStepLength_reverse = (n-1) - (x/2 - 1);long long int pos = x;while (firstStepLength_reverse % 2 != 1){pos += firstStepLength_reverse;firstStepLength_reverse /= 2;}pos += firstStepLength_reverse;cout << pos / 2 + 1 << endl;}return 0;
}/*Construction code
*//*
#include <iostream>
using namespace std;int main()
{long long int n, q;cin >> n >> q;long long int mid = (n+1) / 2;for (int i = 0; i < q; i ++){long long int x;cin >> x;if (x <= mid){cout << x * 2 - 1 << endl;continue;}long long int firstStepLength = (n-x+1) * 2 - 1;long long int pos = x * 2 - 1;while (pos > n){pos -= firstStepLength;firstStepLength *= 2;}cout << pos << endl;}return 0;
}
*/

CF949B A Leapfrog in the Array 【构造】相关推荐

  1. [CodeForces - 950D]A Leapfrog in the Array(思维)

    Description 题目地址: Codeforces Solution 对于一个询问q,如果q是奇数,那么答案就是(q-1)/2 否则将不断q=q/2+n即可 Code #include < ...

  2. 二 Array 数组常用操作方法

    数组链接 Array 构造上的方法 一.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable) ...

  3. Codeforces 题目合集+分类+代码 【Updating...】【361 in total】

    961A - Tetris                                                模拟                                      ...

  4. php reactphp wss_php无限级分类 - ▄︻┻┳000000000000000000000000000000000000 - OSCHINA - 中文开源技术交流社区...

    / $sql = "select id,concat(path,',',id) as abspath,class_name from tree order by abspath"; ...

  5. python的科学计算库有哪些_Python科学计算库-Numpy

    NumPy 是 Python 语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,也是学习 python 必学的一个库. 1. 读取文件 numpy.gen ...

  6. TableModel方法:

    类层次结构图: Java.lang.Object --Java.awt.Component --Java.awt.Container --Javax.swing.JComponent --Javax. ...

  7. Swing之JTable的详细介绍(转)

    表格(Table)的使用与介绍 8-1:使用JTable组件: 类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container - ...

  8. 《JavaScript启示录》——1.21 JavaScript对象和Object()对象

    本节书摘来自异步社区<JavaScript启示录>一书中的第1章,第1.21节,作者:[美]Cody Lindley著,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  9. arcgis 经纬度转大地坐标_土地报备坐标txt(坐标交换数据)转shp遇到的坑及其Python(ArcPy/ArcGIS)实现...

    目录 土地报备坐标txt文件(坐标交换数据)转shp遇到的坑以及该功能的Python(ArcPy/ArcGIS)实现 一. 使用 Python(ArcPy) 绘制shp 什么是ArcPy 如何构造sh ...

最新文章

  1. 如何判断变量是否是数字
  2. hdu 2215(最小圆覆盖)
  3. find 命令搜索符号链接文件夹的方法
  4. Mybatis-plus详解
  5. fullcalendar自定义搜索框_高效搜索任意文件,拯救凌乱的电脑桌面!
  6. Tomcat报错 严重: A child container failed during start
  7. bp神经网络数字识别matlab_卷积神经网络学习识别手写数字时的可视化
  8. 获取Django中model字段名 字段的verbose_name
  9. ORA-24042 ORA-12545 ORA-26714 bug(Bug 5623403)
  10. powerbi 线性回归_微软Power BI 每月功能更新系列——11月Power BI 新功能学习
  11. CrashLoopBackOff问题排查
  12. 5分钟搞懂如何在Spring Boot中Schedule Tasks
  13. Windows 安装maven
  14. 各类w3school网站的区别小记
  15. error: ‘xcb_generic_event_t’ was not declared in this scope
  16. 这里除了安全,什么都不会发生!Docker镜像P2P加速之路
  17. tnsping能成功却连不到目标数据库
  18. 信息基础Homework4
  19. json bosn
  20. 心灵奇旅中不认识的单词和句子

热门文章

  1. php uint,PHP内核 - 数据类型 - 变量
  2. js如何在前端控制台打印
  3. 雅思听力高分有哪些原则?
  4. 锁住你的记录:sqlserver锁定数据库中的一行记录
  5. 录音转文字app有哪些?看完这篇文章你就知道了
  6. python画散点图和折线图
  7. 穷人与富人的区别(转载)
  8. mysql分库分表(一)
  9. Error updating changes: error launching git
  10. 我最后一年的研究生生活