CF949B A Leapfrog in the Array 【构造】
题解概述
从查询位逆向跳跃,回溯至构造前的起始跳转位,即可推导出起始跳转位所对应的数字值,操作时间复杂度为 O ( q l o g ( n ) ) O(qlog(n)) O(qlog(n)).
读者不难达成以下共识
在构造过程中,序列的前半部分数字将会保持原位不动;
当有 n n n个数字时,初始序列共有 n − 1 n-1 n−1个空位,因此总共需要 n − 1 n-1 n−1次移动操作才能完成最终序列构造,即填满空位;
在构造过程中,第 i i i次操作的移动距离也为 i i i;
在构造过程中,一个独特数字的首次操作移动距离总是奇数;
一个独特数字的下一次移动距离会翻倍。
由上述共识可得,无需推演全部构造过程,即可用 O ( l o g n ) O(logn) O(logn)的复杂度推出某一个数字的最终位置。
利用上述共识可逆向迭代回溯出查询位所对应的起始数字值
首先易得,奇数查询位 的对应值为 ⌊ x 2 ⌋ + 1 \lfloor\frac{x}{2}\rfloor + 1 ⌊2x⌋+1 (见共识0) .
下面为 偶数查询位 的推导步骤:
查询位 x x x的左侧有 ⌊ x 2 ⌋ − 1 \lfloor\frac{x}{2}\rfloor - 1 ⌊2x⌋−1个初始填充空位;
由于共有 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,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;
构造前起始 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 【构造】相关推荐
- [CodeForces - 950D]A Leapfrog in the Array(思维)
Description 题目地址: Codeforces Solution 对于一个询问q,如果q是奇数,那么答案就是(q-1)/2 否则将不断q=q/2+n即可 Code #include < ...
- 二 Array 数组常用操作方法
数组链接 Array 构造上的方法 一.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable) ...
- Codeforces 题目合集+分类+代码 【Updating...】【361 in total】
961A - Tetris 模拟 ...
- php reactphp wss_php无限级分类 - ▄︻┻┳000000000000000000000000000000000000 - OSCHINA - 中文开源技术交流社区...
/ $sql = "select id,concat(path,',',id) as abspath,class_name from tree order by abspath"; ...
- python的科学计算库有哪些_Python科学计算库-Numpy
NumPy 是 Python 语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,也是学习 python 必学的一个库. 1. 读取文件 numpy.gen ...
- TableModel方法:
类层次结构图: Java.lang.Object --Java.awt.Component --Java.awt.Container --Javax.swing.JComponent --Javax. ...
- Swing之JTable的详细介绍(转)
表格(Table)的使用与介绍 8-1:使用JTable组件: 类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container - ...
- 《JavaScript启示录》——1.21 JavaScript对象和Object()对象
本节书摘来自异步社区<JavaScript启示录>一书中的第1章,第1.21节,作者:[美]Cody Lindley著,更多章节内容可以访问云栖社区"异步社区"公众号查 ...
- arcgis 经纬度转大地坐标_土地报备坐标txt(坐标交换数据)转shp遇到的坑及其Python(ArcPy/ArcGIS)实现...
目录 土地报备坐标txt文件(坐标交换数据)转shp遇到的坑以及该功能的Python(ArcPy/ArcGIS)实现 一. 使用 Python(ArcPy) 绘制shp 什么是ArcPy 如何构造sh ...
最新文章
- 如何判断变量是否是数字
- hdu 2215(最小圆覆盖)
- find 命令搜索符号链接文件夹的方法
- Mybatis-plus详解
- fullcalendar自定义搜索框_高效搜索任意文件,拯救凌乱的电脑桌面!
- Tomcat报错 严重: A child container failed during start
- bp神经网络数字识别matlab_卷积神经网络学习识别手写数字时的可视化
- 获取Django中model字段名 字段的verbose_name
- ORA-24042 ORA-12545 ORA-26714 bug(Bug 5623403)
- powerbi 线性回归_微软Power BI 每月功能更新系列——11月Power BI 新功能学习
- CrashLoopBackOff问题排查
- 5分钟搞懂如何在Spring Boot中Schedule Tasks
- Windows 安装maven
- 各类w3school网站的区别小记
- error: ‘xcb_generic_event_t’ was not declared in this scope
- 这里除了安全,什么都不会发生!Docker镜像P2P加速之路
- tnsping能成功却连不到目标数据库
- 信息基础Homework4
- json bosn
- 心灵奇旅中不认识的单词和句子