CF764B Timofey and cubes 题解

Content

有一个序列 \(a_1,a_2,a_3,...,a_n\),对于 \(i\in[1,n]\),只要 \(i\leqslant n-i+1\),就把闭区间 \([i,n-i+1]\) 内的所有数翻转。现在给定你翻转后的序列,求原来的序列。

数据范围:\(1\leqslant n\leqslant 2\times 10^5,-10^9\leqslant a_i\leqslant 10^9\)

Solution

做这题之前,我们来看这个序列的规律:

首先拿出一个序列 \([2,6,8,4,1,5,7]\),明显地,此时,\(n=7\)

  1. \(1\leqslant n-1+1\),所以将闭区间 \([1,n]\) 内的所有数翻转,变成了 \([7,5,1,4,8,6,2]\)
  2. \(2\leqslant n-2+1\),所以将闭区间 \([2,n-1]\) 内的所有数翻转,变成了 \([7,6,8,4,1,5,2]\)
  3. \(3\leqslant n-3+1\),所以将闭区间 \([3,n-2]\) 内的所有数翻转,变成了 \([7,6,1,4,8,5,2]\)
  4. \(4\leqslant n-4+1\),所以将闭区间 \([4,n-3]\) 内的所有数翻转,当然原序列是不变的。

我们发现:当偶数位上的数经过翻转后,它又返回到了原来的位置,而奇数位 \(j\) 上的数经过翻转变到了 \(n-j+1\) 的位置。所以,我们可以将对于 \(i\in[1,n]\),只要 \(i\leqslant n-i+1\) 并且 \(i\equiv 1\pmod2\),就调换位置 \(i\) 和位置 \(n-i+1\) 上的数,最后可以得到我们想要的答案。

Code

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

int n, a[200007];

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)	scanf("%d", &a[i]);
	for(int i = 1, j = n; i <= ceil(n / 2.0); i++, j--)
		if(i % 2)	swap(a[i], a[j]);
	for(int i = 1; i <= n; ++i)	printf("%d ", a[i]);
}
posted @ 2021-12-21 20:07  Eason_AC  阅读(50)  评论(0)    收藏  举报