链接:https://www.nowcoder.com/acm/contest/59/E

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给你一个长为n的序列a

定义f(i,j)=(i-j)2+g(i,j)2

g是这样的一个函数
求最小的f(i,j)的值,i!=j

输入描述:

  1. 第一行一个数n
    之后一行n个数表示序列a

输出描述:

  1. 输出一行一个数表示答案

输入例子:
  1. 4
  2. 1 0 0 -1
输出例子:
  1. 1

-->

示例1

输入

  1. 4
  2. 1 0 0 -1

输出

  1. 1

备注:

对于100%的数据,2 <= n <= 100000 , |ai| <= 10000

//////////////////////////////////////////////////////////////////////////////////////////////////

用前缀和s[i]做y值,i做x值,问题等价与求平面最近点对之间的距离

放两个找的别人的平面最近点对的证明

https://www.zhihu.com/question/24755395

http://blog.csdn.net/yql_water/article/details/45939653

自己的代码是借鉴后面那个blog的

///////////////////////////////////////////////////////////////////////////////////////////////////

  1. #include <bits/stdc++.h>
  2. #define mst(a,b) memset((a),(b), sizeof a)
  3. #define lowbit(a) ((a)&(-a))
  4. #define IOS ios::sync_with_stdio(0);cin.tie(0);
  5. #define MP make_pair
  6. #define PB push_back
  7. using namespace std;
  8. typedef long long ll;
  9. typedef pair<int,int> pii;
  10. const ll INF = 0x3f3f3f3f3f3f3f3f;
  11. const int mod=1e9+;
  12. const int maxn=1e5+;
  13. struct node{
  14. int x,y;
  15. bool operator<(const node&p)const{return x<p.x;}
  16. }a[maxn];
  17. ll dis(int L,int R){
  18. return (ll)(a[L].x-a[R].x)*(a[L].x-a[R].x)+(ll)(a[L].y-a[R].y)*(a[L].y-a[R].y);
  19. }
  20. ll dfs(int L,int R,vector<int>&t){
  21. if(R-L<=){
  22. if(R==L){t.PB(L);return INF;}
  23. if(a[L].y>a[R].y)t.PB(R),t.PB(L);
  24. else t.PB(L),t.PB(R);
  25. return dis(L,R);
  26. }
  27. vector<int>tl,tr;
  28. int mid=(L+R)>>;
  29. ll mm=min(dfs(L,mid,tl),dfs(mid+,R,tr));
  30. int i=,j=,n=tl.size(),m=tr.size();
  31. while(i<n||j<m){
  32. if(j>=m||i<n&&a[tl[i]].y<a[tr[j]].y)t.PB(tl[i++]);
  33. else t.PB(tr[j++]);
  34. }
  35. for(i=;i<t.size();++i)for(j=;j<&&j+i<t.size();++j)
  36. mm=min(mm,dis(t[i],t[i+j]));
  37. return mm;
  38. }
  39. int main(){
  40. #ifdef local
  41. freopen("in.txt","r",stdin);
  42. //freopen("out.txt","w",stdout);
  43. #endif
  44. int n;scanf("%d",&n);
  45. for(int i=;i<=n;++i)scanf("%d",&a[i].x),a[i].x+=a[i-].x,a[i].y=i;
  46. sort(a+,a++n);
  47. vector<int>t;
  48. printf("%lld",dfs(,n,t));
  49. return ;
  50. }

wannafly 练习赛11 E 求最值(平面最近点对)的更多相关文章

  1. wannafly 练习赛11 F 求子树(树上莫队+换根)

    链接:https://www.nowcoder.com/acm/contest/59/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64b ...

  2. 牛客网 牛客练习赛11 D.求距离

    D.求距离 链接:https://www.nowcoder.com/acm/contest/59/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言6 ...

  3. wannafly 练习赛11 B 假的字符串(字典树+建边找环)

    链接:https://www.nowcoder.com/acm/contest/59/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...

  4. ACM3 求最值

    /*2*2014.11.18*求最值*描述:给定N个整数(1<=N<=100),求出这N个数中的最大值,最小值.*输入:多组数据,第一行为一个整数N,第二行为N个不超过100的正整数,用空 ...

  5. hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场

    题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...

  6. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

  7. hdu 1754 I Hate It(线段树区间求最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. 牛客练习赛11 假的字符串 (Trie树+拓扑找环)

    牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...

  9. NC15052 求最值

    NC15052 求最值 题目 题目描述 给你一个长为 \(n\) 的序列 \(a\) 定义 \(f(i,j)=(i-j)^2+g(i,j)^2\) \(g\) 是这样的一个函数 求最小的 \(f(i, ...

随机推荐

  1. Android 调用摄像头功能【拍照与视频】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...

  2. 图数据库:AgensGraph

    文章目录 AgensGraph简介 官网及下载 安装AgensGraph 上传并解压 添加agens用户 配置.bashrc 初始化并启动 初始化数据库 启动数据库 执行交互式终端 图数据库基础概念 ...

  3. C++ 引用深入理解

    1.引用作为变量的别名存在,因此可以在一些场合代替指针. 引用相当于指针来说具有更好的可读性和实用性. 例如: /* 编译环境 gcc version 7.4.0 (Ubuntu 7.4.0-1ubu ...

  4. css sticky footer 布局

    方法一:footer 上用负的 margin-top 在内容外面需要额外包一层元素(wrap)来让它产生对应的 padding-bottom.是为了防止负 margin 导致 footer 覆盖任何实 ...

  5. 【Java】 Java多线程(一)

    一.对线程的理解 1.线程概念 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

  6. cassandra基本操作

    basic operate1. 创建keyspace基本语句:CREATE KEYSPACE <identifier> WITH <properties>案例:CREATE K ...

  7. 关于ftp无法链接的情况

    首先查看ftp是否安装 systemctl status vsftpd 如果没有先安装 yum install vsftpd 然后启动 systemctl start vsftpd 如果有报错 Job ...

  8. Linux学习--第十一天--source、环境变量目录、欢迎信息、正则、cut、awk、sed、sort、判断表达式、if、for、case、一些脚本

    source source /root/.bashrc #让修改后的配置文件在不重启系统的情况下生效.source等同于. 环境变量目录 /etc/profile /etc/profile.d/*.s ...

  9. QByteArray与QString的互相转换

    QByteArray baData; QString str = QString(baData); // 反过来转换: QByteArray by1 = str.toLatin1(); QByteAr ...

  10. rediscli命令

    一.rediscli xxx 发送命令 二.进入客户端后的命令