●CodeForces 429D Trick_Function
题链:
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的更多相关文章
- 【Codeforces 429D】 Tricky Function
[题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...
- 【codeforces 429D】Tricky Function
[题目链接]:http://codeforces.com/problemset/problem/429/D [题意] 给你n个数字; 让你求出一段区间[l,r] 使得 (r−l)2+(∑rl+1a[i ...
- codeforces 429D
题意:给定一个数组你个数的数组a,定义sum(i, j)表示sigma(a[i],...a[j]),以及另外一个函数f(i, j) = (i - j)^2 + sum(i+1, j)^2 求最小的f( ...
- Codeforces 429D Tricky Function(平面最近点对)
题目链接 Tricky Function $f(i, j) = (i - j)^{2} + (s[i] - s[j])^{2}$ 把$(i, s[i])$塞到平面直角坐标系里,于是转化成了平面最近点 ...
- Codeforces(429D - Tricky Function)近期点对问题
D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 429D Tricky Function 近期点对
题目链接:点击打开链接 暴力出奇迹. 正解应该是近期点对.以i点为x轴,sum[i](前缀和)为y轴,求随意两点间的距离. 先来个科学的暴力代码: #include<stdio.h> #i ...
- Codeforces Round #245 (Div. 1) 429D - Tricky Function 最近点对
D. Tricky Function Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/problem/42 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
随机推荐
- 2017-2018-1 Java演绎法 第三周 作业
团队任务:团队展示与选题 团队展示 队员学号及姓名 学号 姓名 主要负责工作 20162315 马军 日常统计,项目部分代码 20162316 刘诚昊 项目部分代码,代码质量测试 20162317 袁 ...
- 20145237《Java程序设计》第一周学习总结
教材学习内容总结 java可分为Java SE.Java EE.Java ME三大平台. java SE分为JVM.JRE.JDK.与java语言四个部分. JRE包括java SE API和JVM. ...
- java 二维码解析和生成
package ykxw.web.qrcode.utils; import java.awt.Color; import java.awt.Graphics2D; import java.awt.im ...
- nyoj 聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的"KK"非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国 ...
- PHP处理上传文件
HTML中使用type = 'file'类型的表单可以向服务器上传文件: 上传文件的表单必须在form中定义enctyp = 'multipart/form-data': HTML代码如下: < ...
- C# 使用 GDI+ 画图
最近做一个微信公众号服务,有一些简单的图片处理功能.主要就是用户在页面操作,前端做一些立刻显示的效果,然后提交保存时后端真正修改原图. 我们的后端是 ASP.NET,也就是 C# 语言了,C# 本身处 ...
- "双非"应届生校招如何获得大厂青睐?(内附技术岗超全求职攻略)
写在前面的话 笔者从17年的2月份开始准备春招,其中遇到不少坑,也意识到自己走过的弯路.故写了这篇文章总结一番,本文适合主动学习的,对自己要学的课程不明确的,对面试有恐惧症的...等将来打算从事技术岗 ...
- SpringBoot使用log4j
1.添加log4j相关依赖 在pom.xml文件中添加相关依赖: <!--配置log4j--> <dependency> <groupId>org.springfr ...
- redis中的aof模式,产生的是增量数据,还是全量数据?
先说答案:全量数据. 1.修改redis.conf,开启rdb,禁用aof 上面这个是持久化文件的路径,我们ll看下: 2.启动redis后,cli查看里面的key [root@mini1 redis ...
- 基于哈夫曼编码的文件压缩(c++版)
本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...