暴力思路容易想到,此处暂略思考方法,时间复杂度为 $O(n^2)$,显然无法通过本题。
手工模拟暴力,暂另 $n=5$,则初始序列应当为 $\color{black}a_1,a_2,a_3,a_4,a_5$。
第1次变换: $ \color{red}{!a_1},a_2,a_3,a_4,a_5 $
第2次变换: $ \color{red}{!a_2,a_1},a_3,a_4,a_5 $
第3次变换: $ \color{red}{!a_3,!a_1,a_2},a_4,a_5 $
第4次变换: $ \color{red}{!a_4,!a_2,a_1,a_3},a_5 $
第5次变换: $ \color{red}{!a_5,!a_3,!a_1,a_2,a_4} $
发现了什么?关注第4、5次变换,可以发现:
- 当 $n$ 为奇数时,生成的序列为 $!a_{n},!a_{n-2},...,!a_{1},a_{2},a_{4},...,a_{n-1}$;
- 当 $n$ 为偶数时,生成的序列为 $!a_{n},!a_{n-2},...,!a_{2},a_{1},a_{3},...,a_{n-1}$;
既然发现了结论,直接按照结论输出即可。
代码如下(已经删去快读相关代码):
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
//这里补充快读
}
bitset<2000009> dat;
void print(bool x){
putchar(x?'1':'0');
putchar(' ');
}
int n;
int main() {
n=read();
for(int i=1;i<=n;i++)dat[i]=(read()==1);
if(n%2==1){
for(int i=n;i>=1;i-=2)print(dat[i]^1);
for(int i=2;i<n;i+=2)print(dat[i]);
}
else{
for(int i=n;i>=2;i-=2)print(dat[i]^1);
for(int i=1;i<=n;i+=2)print(dat[i]);
}
}
666
好厉害的题解呀!