●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演绎法 小组成员贡献量汇总
[第一周]贡献量(31) [说明] 完成情况 是指 每次是否全部完成分配的任务,如果全部完成贡献量记为1,否则记为0,与贡献量(时间量)相加计算贡献比例,由于前十周有具体的任务分配,Alpha阶段(第 ...
- 20162330 第十二周 蓝墨云班课 hash
题目要求 利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75) 关键字集合:85,75,57,60,65,(你的8位学号 ...
- 201621123040《Java程序设计》第十四周学习总结
1.本周学习总结 1.1以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 显示所有数据库: show databases; 创建数据库: create database test; 删除数据 ...
- STL常用整理
S T L Sting: << 判断拼音序 size length 字符串长度 str[n] 代表字符串中的一个字符 可用作左值 string::size_type 用于表示字符串长度计量 ...
- C简单实现动态顺序表
<span style="font-size:18px;">一下为简单实现:</span> #define SIZE 3; typedef int Data ...
- 从一次输入框无法输入的bug,谈如何限制输入框输入类型
bug的产生和修改 上周临近周末休息的时候,一个同事跑过来了,对我说:"阿伦啊,有一个页面出问题了,火狐浏览器所有的input都没法输入了."我一听,是不是你给加了什么属性,让in ...
- 常用的 html 标签及注意事项
<a> 标签 用法:用于定义超链接 清除浏览器默认样式: a { text-decoration: none;/* 去除下划线 */ color: #333;/* 改变链接颜色 */ } ...
- 基本数据类型 Symbol
ES6 规范之前, JavaScript 一共有六种数据类型,分别是五种基本数据类型: string . number , boolean , null , undefined ,和一种引用数据类型: ...
- installutil 安装windows service
1:路径:C:\Windows\Microsoft.NET\Framework\v4.0.30319 2:执行指令:C:\Windows\Microsoft.NET\Framework\v4.0.30 ...
- LeetCode & Q27-Remove Element-Easy
Array Two Pointers Description: Given an array and a value, remove all instances of that value in pl ...