CF207B Military Trainings 题解
题目大意
有 n n n 辆坦克,从 1 1 1 到 n n n 编号,这些坦克要进行 n n n 次传递信息,方式如下。
1 1 1 号坦克可以把信息传递给后面的一辆坦克,再传给下一辆坦克。以此类推,直到传递到 n n n 号坦克。
每个坦克有一个传递半径,初始时 i i i 号坦克传递半径为 a i a_i ai。
i i i 号坦克能给 j j j 号坦克传递信息当且仅当 i < j i < j i<j 且 i ≥ j − w i \ge j - w i≥j−w,其中 w w w 表示 j j j 号坦克的传递半径。
在 n n n 号坦克接收到信息之后,它会移动到这列坦克的开头,并用同样的方式传递信息给最移动后最末尾的坦克(也就是原先的 n − 1 n-1 n−1 号坦克)。在信息传递到末尾的坦克后,那辆坦克移动到这列坦克的开头,并发送下一个信息到队列 a 末尾。依此类推,直到传递完 n n n 次信息。
思路
首先可以先不考虑移动的情况,只考虑不移动的情况,最后加上移动。
Step1:反向思考
如果正向考虑(从 1 1 1 号坦克传递到 n n n 号坦克),从 i i i 号坦克能传递到的坦克编号不连续,不容易处理。
那就需要反向思考,考虑哪个坦克能传递到 i i i 号坦克,这样坦克编号就会变连续,容易处理。
进一步的,可以把原题看成从 n n n 号坦克传递信息到 1 1 1 号坦克,条件从 i i i 号坦克传递给 j j j 号坦克变成 j j j 号坦克传递给 i i i 号坦克。
Step2:贪心选择
那对于 i i i 号坦克,他能传递给的坦克编号在 [ i − w , i − 1 ] [i-w,i-1] [i−w,i−1] 区间内( w w w 表示 i i i 号坦克传递半径)。
根据贪心的思路,每次传递信息一定要传递给下一次能到达最远的点。形式化来说,就是选一个点 j ∈ [ i − w , i − 1 ] j\in[i-w,i-1] j∈[i−w,i−1],使得 j − v j-v j−v 最小( v v v 表示 j j j 号坦克传递半径)。
Step3:获取答案
设从 i i i 号坦克要到的坦克编号为 n x i nx_i nxi,那么每次查询只需要设一个变量 n o w now now,表示当前的坦克编号。
那只需要重复循环,每次让 n o w now now 变成 n x n o w nx_{now} nx