题链:

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第五天

    听说

  2. Java作业-集合

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { r ...

  3. js计时功能

    //个位秒加 function time4jia() { //分钟60为上限 所有加停止 if (sz(a('time1').innerHTML) == 6) { return; } var m4 = ...

  4. iOS极光推送SDK的使用流程

    一.极光推送简介 极光推送是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,整合了iOS.Android和WP平台的统一推送服务.使用起来方便简单,已于集成,解决了原生远程推送繁 ...

  5. Spring 以及 Spring MVC Bean元素以及@Bean (Bean 等价于 注解 ??? 没理解错误吧)

    ①.由衷鸣谢Bossen <还是没看懂o(╥﹏╥)o><> {声明Spring Bean和注入Bean的几种常用注解和区别} Bean在Spring和SpringMVC中无所不 ...

  6. vue初尝试--项目结构

    新建一个项目之后,我们来看一下项目的目录结构 几个主要文件的内容 index.html文件(入口文件,系统进入之后先进入index.html) <!DOCTYPE html> <ht ...

  7. gradle入门(1-5)创建并运行Web应用

    一.使用Gretty运行Web应用 Gretty支持Jetty和Tomcat,它不会被Gradle缺少SLF4J绑定所导致的问题所困扰. 1.配置文件build.gradle buildscript ...

  8. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  9. python--socket/Socketerver并发/udp

    Socketerve并发 基于tcp套接字,关键就是两个循环,一个链接循环,一个通讯循环 Socketserver模块中分两个大类:server类(解决链接问题)和request类(解决通信问题) s ...

  10. Text-文本撤销

    #撤销操作 from tkinter import * master = Tk() #打开undo按钮 text=Text(master,width=30,height=5,undo=True) te ...