Codeforces 950D A Leapfrog in the Array ( 思维 && 模拟 )

题意 : 给出 N 表示有标号 1~N 的 N 个数,然后从下标 1 开始将这 N 个数每隔一位放置一个,直到 N 个数被安排完,现在有一个操作就是每次将数列中最右边的数向离其左边最近的空缺处填上,一直这样子填,直到下标 1~N 被填满,然后现在给出 Q 个询问,每个询问给出一个 X ,你需要回答下标为 X 的位置填放了什么数?

分析 :  

初始状态每个数都处于奇数位,且可以根据位置下标得到具体的数是什么,即 num = (pos>>1)  + 1

观察到当最后填充操作完成时,每个奇数位置的数是没有移动过所以其值是确定的

即 num = (pos>>1) + 1   ( pos%2 != 0 )

后面就是要处理偶数位置的情况,按照题意从初始到最后去模拟貌似并不好做

考虑从最终状态推回初始状态,对于每一个偶数位的数

举个例子 N = 4、考虑 1_243 时候的状态

在 3 下一步就移动到 _ 这个偶数位的时候,它左边是有 pos/2 个数的(奇数位置的数)

所以可以根据这个推出 3 移动到 _ 之后,它右边应有 N - (pos>>1) - 1 个数

所以如果是从 1324 逆推回 1_243 的时候 _ 这个偶数位置对应的值应当是 N - (pos>>1)

如果经过 N - (pos>>1) 这个移动后,位置处于奇数位,那么数就可以确定了

否则就继续移动,最后就能对于每一个偶数位采取逆推的方式来得到其值

#include<bits/stdc++.h>
#define LL long long
using namespace std;

int main(void)
{
    long long N, Q;
    scanf("%I64d %I64d", &N, &Q);
    while(Q--){
        long long X;
        scanf("%I64d", &X);
        while(!(X&1))
            X += (N - (X>>1));
        printf("%I64d\n", (X>>1)+1);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Rubbishes/p/8969085.html

时间: 2024-11-02 01:09:55

Codeforces 950D A Leapfrog in the Array ( 思维 && 模拟 )的相关文章

codeforces 949B :A Leapfrog in the Array 找规律

题意: 现在给你一个n,表示有2*n-1个方格,第奇数方格上会有一个数字 1-n按顺序放.第偶数个方格上是没有数字的.变动规则是排在最后一个位置的数字,移动到它前边最近的空位 . 直到数字之间没有空位.之后有q次询问.每次问你这个位置上的数是多少 题解: 1:  1 2:  1 2 3:  1 3 2 4:  1 3 2 4 5:  1 5 2 4 3 6:  1 4 2 6 3 5 7:  1 6 2 5 3 7 4 8:  1 5 2 7 3 6 4 8 9:  1 9 2 6 3 8 4

【CodeForces 915 C】Permute Digits(思维+模拟)

You are given two positive integer numbers a and b. Permute (change order) of the digits of a to construct maximal number not exceeding b. No number in input and/or output can start with the digit 0. It is allowed to leave a as it is. Input The first

Codeforces Round #546 (Div. 2) D 贪心 + 思维

https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则,假如u在v相邻前面,那么u和v可以交换位置,问你是队列最后一个人的时候你最前可以换到前面哪里 题解 因为相邻才能换,所以最后一个换到前面一定是一步一步向前走,所以不存在还要向后走的情况 设最后一个为u,假设前面有一个能和u换位置的集合,那么需要将这些点尽量往后移动去接u 假设前面有一个不能和u换位置的集合S,

CodeForces 1292A NEKO&#39;s Maze Game(思维)

1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <

Codeforces 216D Spider&#39;s Web 树状数组+模拟

题目链接:http://codeforces.com/problemset/problem/216/D 题意: 对于一个梯形区域,如果梯形左边的点数!=梯形右边的点数,那么这个梯形为红色,否则为绿色, 问: 给定的蜘蛛网中有多少个红色. 2个树状数组维护2个线段.然后暴力模拟一下,因为点数很多但需要用到的线段树只有3条,所以类似滚动数组的思想优化内存. #include<stdio.h> #include<iostream> #include<string.h> #in

【CodeForces - 950D】A Leapfrog in the Array

Description 题目地址: Codeforces Solution 对于一个询问q,如果q是奇数,那么答案就是(q-1)/2 否则将不断q=q/2+n即可 Code #include <cstdio> long long n,x; int q; int main(){ scanf("%I64d%I64d",&n,&q); while(q--){ scanf("%I64d",&x); while(!(x&1)) x=

codeforces 349B Color the Fence 贪心,思维

1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1-9每个字母分别要ai升油漆,问最多可画多大的数字. 贪心,也有点考思维. #include<bits/stdc++.h> using namespace std; #define LL long long #define INF 0x3f3f3f3f int main() { int v,a[1

codeforces 558B. Amr and The Large Array 解题报告

题目链接:http://codeforces.com/problemset/problem/558/B 题目意思:给出一个序列,然后找出出现次数最多,但区间占用长度最短的区间左右值. 由于是边读入边比较,因此问题最关键的是,记录每个数第一次出现的位置,即左值.因为要保证次数是出现最多,因此需要一个cnt[]数组来记录出现次数.然后当最多出现次数与当前cnt[x]次数相同时,要选择区间较短的,再更新左右区间值. 赛中短路竟然想不出来~~~泪啊~~泪啊- >_< 1 #include <io

Codeforces 758C:Unfair Poll(思维+模拟)

http://codeforces.com/problemset/problem/758/C 题意:教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点,当点完第n列的名之后,接着点第n-1列的名.以此类推,就是从列上来看的话:1,2,3,4,……,n,n-1,n-2,……,1 ,2,…….这样的顺序点名.老师上课总共点k次名,问该课堂最多可以点同一个同学多少次,最少可以点同一个同学多少次,点了位置为(x,y)的同学多少次名. 思路:一遇到这种题目