实验任务
对于一个包含 \(n\) 个整数的序列 \(a_1, a_2, \cdots, a_n\)。定义:
\[f(i,j)=(j-i)^2+(\sum _{k=i+1}^{j}{\alpha{_k}})^2.\] 现要求计算出所有\(f(i,j)\ (1\leq i < j \leq n)\)中的最小值。
数据输入
输入的第一行为数字 \(n\ (2\leq n\leq 10^5)\),表示给定序列的长度。第二行包含 \(n\) 个整数,表示序列中的整数 \(a_1, a_2, \cdots, a_n\ (|a_i|\leq 10^4)\)。
数据输出
输出一个整数,即对于所有\(f(i,j)\ (1\leq i < j \leq n)\) 中的最小值。
输入示例 | 输出示例 |
---|---|
4 1 0 0 -1 |
1 |
数据范围
\(80\%\)的得分点,\(n \leq 1000\);\(20\%\)的得分点,\(n \leq 100000\)。
源代码
1 |
|
设计思路与复杂度分析
令前缀和(可以预处理出来)\(sum_i=\sum_{j=1}^{i}{\alpha{_j}}\),则\(f(i,j)=(j-i)^2+(sum_j-sum_i)^2\)。令二维平面上的点\(p_i = (i,sum_i)\),则\(f(i,j) = (distance(i,j))^2\)。目标函数为\(\min f(i,j)= \min (distance(i,j))^2\),即将问题转化为二维平面的最近点对问题。关于最近点对的知识点请参考教材P29。
算法耗时最多在归并排序(平衡),复杂度为\(O(nlogn)\)。