题链:

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

分治,最近点对
不难发现g(i,j)=sum[j]-sum[i],
那么f(i,j)=(i-j)²+(sum[j]-sum[i])²
=(i-j)²+(sum[i]-sum[j])²
然后可以把(i,sum[i])看成平面上的点,
那么要求f(i,j)min就转变为了求平面上的最近点对问题。
用分治即可解决。

代码:

#include<bits/stdc++.h>
#define MAXN 100005
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3fll
using namespace std;
struct Point{
ll x,y;
bool operator < (const Point &rtm) const {
return x<rtm.x||(x==rtm.x&&y<rtm.y);
}
}A[MAXN],B[MAXN];
int N;
ll sum[MAXN];
int idx[MAXN];
ll ABS(ll x){return x<0?-x:x;}
bool cmpx(const Point &a,const Point &b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
bool cmpy(const Point &a,const Point &b){return a.y<b.y||(a.y==b.y&&a.x<b.x);}
ll dis2(Point &a,Point &b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}
void build_index(){
map<Point,int>M;
for(int i=1;i<=N;i++) M[A[i]]=i;
for(int i=1;i<=N;i++) idx[i]=M[B[i]];
}
ll divide(int l,int r){
ll ans=INF;
static int tmpidx[MAXN];
static Point tmpB[MAXN];
if(r-l<=3){
for(int i=l;i<=r;i++) for(int j=i+1;j<=r;j++)
ans=min(ans,dis2(A[i],A[j]));
return ans;
}
int mid=(l+r)>>1,bl=l,br=mid+1,bnt;
for(int i=l;i<=r;i++){
if(idx[i]<=mid) tmpB[bl]=B[i],tmpidx[bl++]=idx[i];
else tmpB[br]=B[i],tmpidx[br++]=idx[i];
}
for(int i=l;i<=r;i++) B[i]=tmpB[i],idx[i]=tmpidx[i];
ans=min(ans,divide(l,mid));
ans=min(ans,divide(mid+1,r));
bnt=l; bl=l; br=mid+1;
//归并排序
while(bl<=mid&&br<=r){
if(cmpy(B[bl],B[br])) tmpB[bnt++]=B[bl++];
else tmpB[bnt++]=B[br++];
}
while(bl<=mid) tmpB[bnt++]=B[bl++];
while(br<=r) tmpB[bnt++]=B[br++];
for(int i=l;i<=r;i++) B[i]=tmpB[i]; bnt=1;
for(int i=l;i<=r;i++) if(ABS(B[i].x-A[mid].x)<=ans)
tmpB[bnt++]=B[i];
for(int i=1;i<bnt;i++)
for(int j=1;j<=6&&i+j<bnt;j++)
ans=min(ans,dis2(tmpB[i],tmpB[i+j]));
return ans;
}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%lld",&sum[i]);
sum[i]+=sum[i-1];
A[i]=B[i]=(Point){i,sum[i]};
}
sort(A+1,A+N+1,cmpx);
sort(B+1,B+N+1,cmpy);
build_index();
ll ans=divide(1,N);
printf("%lld\n",ans);
return 0;
}

  

●CodeForces 429D Trick_Function的更多相关文章

  1. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  2. 【codeforces 429D】Tricky Function

    [题目链接]:http://codeforces.com/problemset/problem/429/D [题意] 给你n个数字; 让你求出一段区间[l,r] 使得 (r−l)2+(∑rl+1a[i ...

  3. codeforces 429D

    题意:给定一个数组你个数的数组a,定义sum(i, j)表示sigma(a[i],...a[j]),以及另外一个函数f(i, j) = (i - j)^2 + sum(i+1, j)^2 求最小的f( ...

  4. Codeforces 429D Tricky Function(平面最近点对)

    题目链接  Tricky Function $f(i, j) = (i - j)^{2} + (s[i] - s[j])^{2}$ 把$(i, s[i])$塞到平面直角坐标系里,于是转化成了平面最近点 ...

  5. Codeforces(429D - Tricky Function)近期点对问题

    D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. Codeforces 429D Tricky Function 近期点对

    题目链接:点击打开链接 暴力出奇迹. 正解应该是近期点对.以i点为x轴,sum[i](前缀和)为y轴,求随意两点间的距离. 先来个科学的暴力代码: #include<stdio.h> #i ...

  7. Codeforces Round #245 (Div. 1) 429D - Tricky Function 最近点对

    D. Tricky Function Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/problem/42 ...

  8. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  9. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

随机推荐

  1. beta冲刺总结-咸鱼

    前言:emmmmmmm冲刺总结应该可以吐槽了?我发誓后面几篇冲刺我是很努力用正经语言描述了!!!!! 心得:emmmmm,说真的--到beta冲刺的时候才是真正感受到了组队的存在,基本上隔三差五就约一 ...

  2. 20162311张之睿 Linux基础与Java开发环境实验报告

    实验一 Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没有Linux基础的同学建议先学习& ...

  3. 个人作业2——NBA 2k18案例分析

    产品:篮球体育类游戏NBA 2k18 选择理由:这款游戏是<NBA 2k>的正统续作,自己和身边的朋友都对篮球比较感兴趣,经常看NBA,所以近几年的版本都有购买下载,加上游戏中人物动作比较 ...

  4. 下载文件downloadFile

    public static void downLoadFile(InputStream inStream, String fileName) { if (StringUtils.isBlank(fil ...

  5. python使用tesseract-ocr完成验证码识别(模型训练和使用部分)

    一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...

  6. Python扩展模块——自动化(testlinkAPI的使用)

    使用TESTLINKAPI首先要安装TestLink_API_Python_client-0.6.4(当前最新版本) 目前只使用到了通过api获取testlink中的自定义字段and值 url = ' ...

  7. c# BinaryWriter 和 BinaryReader

    string path = @"C:\Users\Administrator\Desktop\1.txt"; using (FileStream ws = new FileStre ...

  8. Linq GroupJoin

    static void Main(string[] args) { List<Person> persons = new List<Person> { }, }, }; Lis ...

  9. 算法题丨3Sum Closest

    描述 Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  10. 作业五:RE 模块模拟计算器

    # !/usr/bin/env python3 # _*_coding:utf-8_*_ ''' 实现模拟计算器的功能: 公式: - * ( (- +(-/) * (-*/ + /*/* + * / ...