CF538G (套路题)
CF538G
题目大意
你有一个长度为\(l\)的指令序列,每个指令为向上,向下,向左,向右中的一种。
机器人会循环执行该序列,即,执行完第\(l\)个指令后,就会重新开始执行第一个指令。
现在,给你\(n\)个信息,每个信息为:在第\(t\)秒时,机器人所处的位置\((x,y)\)
请求出一个合法的序列,如无解,则输出\(No\)
\(n\le2*10^5\ l\le2*10^6\)
解题历程
一开始,真的很自闭,二维的太难考虑了。
去翻题解,题解第一行说,这样的位移可以等价于每秒独立地在\(x+y\)和\(x-y\)方向上\(+1\)或\(-1\)
豁然开朗。
于是,现在只需要考虑一维的情况了。
我们发现,它循环多次,又剩余一点。
我们就考虑这多出的一点,令:
\(t=p*l+q\)
若我们假设整个序列在当前方向上的位移为\(x\),\(q\)内的位移为\(f(q,x)\),\(t\)内的位移为\(sum\)
则\(f(q,x)=sum-px\)
我们把所有的信息按\(q\)排序,那么,需满足以下限制
\[|f(q_i,x)-f(q_{i+1},x)|\le q_{i+1}-q_i
\]
然后,解方程,找出值域内的任意\(x\),再带回去算即可
注:可能需要考虑以下奇偶性的问题
代码
由于我是口胡选手,所以就先咕着。
以仁心说,以学心听,以公心辩