【Codeforces 950D】A Leapfrog in the Array | 思维、思维、思维!!

博客内容涉及一个数组操作的思维挑战,初始数组由[1,n]的数字构成,通过特定规则移动元素,最终达到所有位置都在[1,n]内。博主分享了解题思路,重点在于逆向推导原始状态,并提供了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

最初的数组长度为2×n2 \times n2×n,包含[1,n][1,n][1,n]nnn个数字,第i个数字在第2×i−12 \times i-12×i1的位置上。

每次将最后一个非空的位置,移到最后一个空位置上。

当所有位置全部在[1,n][1,n][1,n]时,停止

给出mmm次询问,每次询问,算法停止后第xxx位置的数字是哪个数字:

在这里插入图片描述
不懂就看图

题目思路:

卡的心态裂开…

思维题能不能做出来啊…

考虑最终状态逆向推到出最初的状态,假设xxx的位置pospospos是奇数,那么这个奇数就不会动了,因为移动必定会移动到一个偶数格子上,所以当位置是奇数时,就说明已经到达了初始状态。

那么根据现在的位置pospospos推出上一轮pospospos应该在的位置:

  1. 首先,pos左边包含pos一定有(pos+1)/2(pos+1)/2(pos+1)/2个数
  2. 右边的数一定紧挨着有(n−{(pos+1)/2})(n-\{ (pos+1)/2 \})(n{(pos+1)/2})个数
  3. 并且他一定是从末尾移动过来的,所以上一轮的位置就是:pos+(n−{(pos+1)/2})+1pos + (n-\{ (pos+1)/2 \})+1pos+(n{(pos+1)/2})+1

这样当pospospos是奇数时退出循环,就是最后的位置了…

思维题一定要注意:

逆向推导

多画总结规律

Code:

/*** keep hungry and calm CoolGuang!  ***/
//#pragma GCC optimize(3)
#include <bits/stdc++.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
#include<iostream>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const ll INF= 1e18+7;
const int maxn = 1e6+700;
const int M = 1e6+8;
const int mod= 1e9+7;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a){char c=getchar();T x=0,f=1;while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;}
ll n,m,p;
int main(){ 
  read(n);read(m);
  for(int i=1;i<=m;i++){
    ll x;read(x);
    while(x%2 == 0){
      ll opx = x/2+1;///左边的数量
      x = (x+(n-opx)+1);
    }
    printf("%lld\n",(x+1)/2);
  }
  return 0;
}
/***
1
24
133321333
***/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只酷酷光儿( CoolGuang)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值