cf950d A Leapfrog in the Array】的更多相关文章

考虑在位置 \(p\) 的青蛙. 如果 \(p\) 是奇数,答案显然是 \((p+1)/2\). 否则,由于未跳时 \(p\) 左边有 \(p/2\) 只,则 \(p\) 右边有 \(n-p/2\) 只,则这青蛙是从 \(p+n-p/2\) 处跳过来的. #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int q; ll n, uu; ll f(ll x){ if(x&…
题目链接:A Leapfrog in the Array 题意:给出1-n的n个数,从小到大每隔一个位置放一个数.现在从大到小把数往前移动,每次把最右边的数移动最靠右边的空格处直到n个数都在前n个位置. 题解:从数据的大小就可以看出这题一定是推公式的题,那么假设现在一个数刚刚移动到了x位置,那么这个数之前一定有x/2个数没有移动过,所有这个数后面就有n-x/2个数(这里包括x本身).所以x在移动之前的位置就是x+(n-x/2).所以一直将所要求的x 按 x =  x+(n-x/2)这个公式一直向…
B. A Leapfrog in the Array time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output Dima is a beginner programmer. During his working process, he regularly has to repeat the following operation aga…
http://codeforces.com/problemset/problem/949/B Dima is a beginner programmer. During his working process, he regularly has to repeat the following operation again and again: to remove every second element from the array. One day he has been bored wit…
http://codeforces.com/contest/950/problem/D 前n/2个格子的奇数下标的数没有参与移动 候n/2个格子的奇数下标的数一定是一路移向偶数下标移 所以还原数的初始位置时,让数沿原来的路线向右移动,到达的第一个奇数下标就是这个数的初始位置 在初始位置a的数是(a+1)/2 现在就剩下了如何还原数向左移的过程 假设数a最后移到了位置x, 在位置x之前有 x/2 个奇数位有数 a移到了x,说明除了前面的数,剩下的数都在x之后 所以位置x之后有n-x/2-1 个数,…
题意:n个数1~n(n<=1e18)依次放在一个数组中,第i个数位置为2i-1,其它地方是空的.现在重复以下操作:将最右边的数放到离其左边最近的空的位置,直到所有数移到前一半的位置中.有q<=200000个询问,问你第i个数最终再哪个位置. 题解:这题被某人秒了,所以估计核心代码量不超过2行,于是XJB找规律,找了三四十分钟A了,不明觉厉. 找规律的方向是按照数据必定是个qlogn的算法,输入一个n,肯定要不断除2,又发现前n/2个数一直不动,又发现貌似后n/2的数有些神秘的间隔.最后XJB写…
题意: 给出1<=n<=10^18和1<=q<=200000,有一个长度为2*n-1的数组,初始时单数位置存(i+1)/2,双数位置是空的.每次找出最右边的一个数将它跳到离它最近的左边的空格,反复操作直到前n个数被充满 .q个询问,每个询问给出一个数x<=n,输出最终的序列x位置的数是什么. 分析: 一看数据规模和这个题就大概想到是数学题,然后试着找规律推式子.按照蒟蒻我的惯例这种题先写暴力找规律.然后发现,每次跳,第一次跳跳一个,再一次跳两个,一直到跳到n-1个. 那么从左…
思路: 最终的时候,对于位置p,若p是奇数,则该位置的元素是(p + 1) / 2:若p是偶数,需要从p开始不断地迭代寻找上一次跳跃所处的位置(p = p + n - p / 2),直到p是奇数为止.这个过程直观上看是log(n)的,因为每次跳跃的长度都在n / 2级别. 实现: #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n, q, x; cin >> n…
题意: Dima是一名初级程序员. 在他的工作中,他经常不断地重复以下操作:从数组中删除每个第二个元素. 有一天,他对这个问题的解决方案感到厌倦,他提出了以下华丽的算法. 假设有一长度为2n的数组,最初的数组包含从1到n的n个数字,数字i位于序号为2i - 1的单元格中(序号从1开始编号),并且数组的其他单元格为空.每个步骤你需要选择一个最大序号的非空单元格,并将其中的数字移动到它左边最近的空单元格.一直循环该过程,直到所有n个数字出现在数组的前n个单元格中.例如,如果n = 4,则数组更改如下…
题意 : 给出 N 表示有标号 1~N 的 N 个数,然后从下标 1 开始将这 N 个数每隔一位放置一个,直到 N 个数被安排完,现在有一个操作就是每次将数列中最右边的数向离其左边最近的空缺处填上,一直这样子填,直到下标 1~N 被填满,然后现在给出 Q 个询问,每个询问给出一个 X ,你需要回答下标为 X 的位置填放了什么数? 分析 :   初始状态每个数都处于奇数位,且可以根据位置下标得到具体的数是什么,即 num = (pos>>1)  + 1 观察到当最后填充操作完成时,每个奇数位置的…