一个自认很巧妙的脑筋急转弯,放在了我出的Citric II杯NOIP模拟赛第一题。
【题目描述】
Lemon认为在第一届『Citric』杯模拟赛中出的题目太简单了,于是他决定,这次要给参赛选手们一个下马威! ^_^
Lemon手上有一个长度为n的数列,第\(i\)个数为\(x_i\)。
他现在想知道,对于给定的a,b,c,他要找到一个i,使得\[a\cdot(i+1)\cdot x_i^2+(b+1)\cdot i\cdot x_i+(c+i)=0\]成立。
如果有多个i满足,Lemon想要最小的那个i。
Lemon有很多很多组询问需要你回答,多到他自己也不确定有多少组。所以在输入数据中\(a=b=c=0\)标志着Lemon的提问的结束。
更加糟糕的是,Lemon为了加大难度,决定对数据进行加密以防止离线算法的出现。
假设你在输入文件中读到的三个数为a0,b0,c0,那么Lemon真正要询问的a=a0+lastans,b=b0+lastans,c=c0+lastans.
lastans的值是你对Lemon的前一个询问的回答。如果这是第一个询问,那么lastans=0
所有的询问都将会按上述方式进行加密,包括标志着询问的结束的那个询问也是这样。
【输入格式】
输入文件第一行包含一个正整数n,表示数列的长度。
输入文件第二行包含n个整数,第i个数表示xi的值。
接下来若干行,每行三个数,表示加密后的a,b,c值(也就是上文所述的a0,b0,c0)
【输出格式】
包含若干行,第i行的值是输入文件中第i个询问的答案。注意,你不需要对标志着询问结束的那个询问作答。
同时,标志着询问结束的询问一定是输入文件的最后一行。也就是,输入文件不会有多余的内容。
【数据规模】
时间限制3s
对于100%的数据,满足N<=500000,需要作出回答的询问个数不超过500000,xi的绝对值不超过30000,解密后的a的绝对值不超过50000,解密后的b的绝对值不超过10^8,解密后的c的绝对值不超过10^18.
【题解】
首先要注意到此题的题目描述完全是吓人的>_<
首先注意到,因为最后一个询问(也就是不需要回答的那个询问)解密后一定是a=b=c=0
也就是说,a0+lastans=0,于是我们可以直接得出倒数第二个询问(也就是要回答的最后一个询问)的答案是-a0.
得到了倒数第二个询问的答案后,我们将答案和倒数第二个询问的a0,b0,c0带入原题的式子
可以得出一个关于倒数第三个询问的答案的一次方程。于是可以O(1)解出倒数第三个询问的答案。
如此推下去,于是就O(N)了