【题目链接】

http://codeforces.com/problemset/problem/429/D

【算法】

令Si = A1 + A2 + ... + Ai(A的前缀和)

则g(i,j) = Sj - Si

f(i,j) = (i-j)^2 + (Si - Sj)^2

观察这个式子,我们发现可以用类似于平面最近点对的算法来求解该问题

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
const long long INF = 1e15; int i,n,x;
long long sum[MAXN]; struct point
{
long long x,y;
} a[MAXN]; inline bool cmpx(point a,point b)
{
return a.x < b.x;
}
inline bool cmpy(point a,point b)
{
return a.y < b.y;
}
inline long long dist(point a,point b)
{
return abs(a.x - b.x) * abs(a.x - b.x) + abs(a.y - b.y) * abs(a.y - b.y);
}
inline long long Closest_Pair(int l,int r)
{
int i,j,mid,len = ;
long long d;
static point s[MAXN];
if (l == r) return INF;
if (l + == r) return dist(a[l],a[r]);
mid = (l + r) >> ;
d = min(Closest_Pair(l,mid),Closest_Pair(mid+,r));
for (i = l; i <= r; i++)
{
if ((double)abs(a[i].x - a[mid].x) <= (double)sqrt(d)) s[++len] = a[i];
}
sort(s+,s+len+,cmpy);
for (i = ; i <= len; i++)
{
for (j = i + ; j <= len && s[j].y - s[i].y <= sqrt(d); j++)
{
d = min(d,dist(s[i],s[j]));
}
}
return d;
} int main()
{ scanf("%d",&n);
for (i = ; i <= n; i++)
{
scanf("%d",&x);
sum[i] = sum[i-] + x;
}
for (i = ; i <= n; i++) a[i] = (point){i,sum[i]};
sort(a+,a+n+,cmpx);
printf("%I64d\n",Closest_Pair(,n)); return ; }

最新文章

  1. 使用Gitblit 在windows 上部署你的Git Server
  2. iOS代码汉字转拼音
  3. js刷新框架子页面的七种方法代码
  4. Python检测IP合法 是否为公网IP
  5. SpringMvc处理JSON
  6. HashMap总结
  7. Extreme Learning Machine(ELM)的工程哲学
  8. Android之自定义控件入门
  9. js计算日期的前几天的日期
  10. delphi TreeView修改选中的节点的颜色和背景
  11. AR/VR行业是否会像智能手机一样的飞速崛起
  12. 云计算之路-阿里云上:docker swarm 集群故障与异常
  13. CLOSE_WAIT问题-TCP
  14. MongoDB 在系统数据库local上无法创建用户的解决方法
  15. 【转】Android中dip(dp)与px之间单位转换
  16. SSM 整合 quartz JDBC方式实现job动态增删改查记录
  17. c#中日期格式化
  18. 【Java面试题】32 ArrayList和Vector的区别
  19. Genymotion使用分析
  20. 【BZOJ4754】独特的树叶(哈希)

热门文章

  1. lombok无法解析log
  2. 【2018百度之星资格赛】 A 问卷调查 - 位运算&amp;动规
  3. ubuntu中mysql忘记密码如何修改
  4. 使用Postman Interceptor发送带cookie的请求一直loading的解决法案
  5. 数据分布vs聚类-数据预处理技巧-对数变换
  6. linux下的进程
  7. 转一篇GCC相关的文章
  8. AtCoder Beginner Contest 131 Solution
  9. 【C++】实现记录软件计时时间
  10. 【Codeforces 464A】No to Palindromes!