题目链接
解题方法:推导 + 反向模拟
题目分析
题目大意
先给出一个数字n
,形成一个长度为n
的数组,ai = i,现在有四种操作。第一种,取所有奇数位置的值,再取所有偶数位置的值。第二种,n
个位置的元素关于中心对称,形成新的数列。第三种,将每一个位置的值平方。第四种,查询之前的操作全部完成之后某一位置的值。
解析
看题目很容易发现,最多执行五十次操作,所以每次查询的时候计算的话复杂度并不会很大。分析一下这个问题,看前三种操作,后两种还是挺容易的,对称的话直接找n+1-pos
即可找到原来的位置,值平方的话只需要一直平方即可,因为二进制位只有一个1,所以快速幂在这种情况下完全没有优势,直接乘即可,最多也就50次。麻烦一点的是第一个问题,要分n为奇数和n为偶数两种情况考虑。当n为奇数时,对于这n个位置的奇数位,new = ( old + 1 ) / 2
,对于偶数位 new = old / 2 + ( n - n / 2 )
。再看n为偶数的情况,上面两个公式仍然成立,所以只需要倒推一下,找出来old
关于new
的位置变换公式即可。查询的时候直接跑那么多次的平方即可。
代码
1 |
|