整理的算法模板合集: ACM模板


目录

CF429D Tricky Function

题意实际上就是给定长度为 nnn 的一串序列a1,a2,...,ana_1, a_2,...,a_na1​,a2​,...,an​,找到两个正整数i,j∈[1,n]i,j\in[1,n]i,j∈[1,n],求(i−j)2+(∑k=i+1jak)2(i-j)^2+(\sum_{k=i+1}^{j}a_k)^2(i−j)2+(∑k=i+1j​ak​)2
的最小值

分析
将原式中的∑k=i+1jak\sum_{k=i+1}^{j}a_k∑k=i+1j​ak​用前缀和Sj−SiS_j-S_iSj​−Si​替代,则原式变换为(i−j)2+(Sj−Si)2(i-j)^2+(S_j-S_i)^2(i−j)2+(Sj​−Si​)2

不难看出变换后的式子为两点之间欧几里德距离的平方,于是原题转化为求平面上的最近点对距离的平方。

关于最近点对距离的求解可使用二分法

注意本题的数据会卡普通的O(nlogn)O(nlogn)O(nlogn)的分治求平面最近点对算法,我们需要加一些玄学优化,比如在筛y轴的时候一旦大于d就直接break,因为是排过序的,当前的y都大了,说明接下来的所有点都不能用了。

#include<cstdio>
#include<algorithm>
#include<cmath>
#define R register
using namespace std;
const int N = 200007;typedef long long ll;struct Point {ll x, y;bool operator < (const Point& t)const {return y < t.y;}
};Point v[N], tmp[N];
int n;ll get_dist(Point A, Point B)
{return (ll)(A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y);
}ll solve(const int l, const int r){//求平面最近点对的分治算法if(l == r)return 0x3f3f3f3f3f;if(l + 1 == r)return get_dist(v[l], v[r]);//分治到了一个点对,直接返回答案int mid = (l + r) >> 1;ll d1 = solve(l, mid), d2 = solve(mid + 1, r);ll d = min(d1, d2);int tot = 0;//先筛选xfor(int i = l; i <= r; ++ i){if((v[mid].x - v[i].x) * (v[mid].x - v[i].x) <= d)tmp[ ++ tot] = v[i];}sort(tmp + 1, tmp + tot + 1);//按y排序//再筛选yfor(int i = 1; i <= tot; ++ i){for(int j = i + 1; j <= tot; ++ j){if((tmp[i].y - tmp[j].y) * (tmp[i].y - tmp[j].y) > d)break;//剪枝优化,不加过不了本题d = min(d, get_dist(tmp[i], tmp[j]));}}return d;
}int main()
{scanf("%d", &n);for(int i = 1; i <= n; ++ i){int x;scanf("%d", &x);v[i].y = v[i - 1].y + x;//y就是前缀和,我们通过公式推出来的v[i].x = i;}ll minv = solve(1, n);printf("%lld\n", minv);return 0;
}

CF429D Tricky Function(求解公式、经分析转为求平面最近点对、思维)相关推荐

  1. 两相交的直线段夹角平分的直线上过交点距离为d的另一点求解公式

    两相交的直线段夹角平分的直线上过交点距离为d的另一点求解公式 问题描述: 已知p0,p1,pN三个点,p0到p1走向直线段,pN到p0走向直线段,相交于p0点, 则pN到p0到p1夹角为a,平分夹角为 ...

  2. 卷积法求解系统的零状态响应_连续LTI系统零状态响应求解方法的分析

    连续 LTI 系统零状态响应求解方法的分析 张淑敏 [摘 要] [摘 要]零状态响应是电子技术相关课程中的一个重要概念,本文将 通过对时域分析法和(复)频域分析法求解连续 LTI 系统零状态响应的分析 ...

  3. python多元函数求解_一元和多元函数求极值(Python)-牛顿法

    1. 引言 我们在中学的时候学过一元二次函数,求解时引入一个求根公式,代入公式就可以得到不同的根,假如想计算一个高次方程的解,我们还能推导出求根公式吗? 伽罗瓦在群论中证实,五次及以上多项式方程没有显 ...

  4. python求组合数c_python实现排列组合公式C(m,n)求值

    python实现排列组合公式C(m,n)求值 实验六 理解浮点数运算的误差 实验目的: 1.理解组合数定义式的化简 2.理解浮点数运算的误差可能带来的问题 错误代码 def func(m,n): re ...

  5. 欧拉四面体公式,用来求三棱椎的体积。

    欧拉四面体公式,用来求三棱椎的体积. V=sqrt((4*a*a*b*b*c*c-a*a*(b*b+c*c-m*m)*(b*b+c*c-m*m)-b*b*(c*c+a*a-n*n)*(c*c+a*a- ...

  6. matlab求解微分式,如何用Matlab求微分方程de符号解

    1.dsolve()函数 求解常微分方程的通解在求通解问题 % syms y(x) % y=dsolve(x^2+y+(x-2*y)*diff(y)==0)这里插入代码片 求解常微分方程的初边值问题% ...

  7. 高斯函数(Gaussian function)的详细分析

    摘要 论文中遇到很重要的一个元素就是高斯核函数,但是必须要分析出高斯函数的各种潜在属性,本文首先参考相关材料给出高斯核函数的基础,然后使用matlab自动保存不同参数下的高斯核函数的变化gif动图,同 ...

  8. matlab流量结构分析,科学网-分享求解“结构分解分析(SDA)”各项均值的MATLAB程序-计军平的博文...

    点此下载(MATLAB File Exchange) [2015.02.18补充]其他研究人员的MATLAB代码 Sayago-Gomez, Juan Tomas, (2014), Matlab Co ...

  9. 复化辛普森公式的误差matlab,求两个matlab的程序,分别利用复化梯形公式和辛普森公式求解误差函数erf(x)。...

    main.m g=@(t)exp(-t.^2); x=linspace(0,5,100); y1=zeros(1,100); y2=zeros(1,100); for i = 1:100 y1(i)= ...

最新文章

  1. java for 跳过_在for循环中跳过错误
  2. 使用xshell SSH远程连接 linux
  3. OpenCV中使用类VideoCapture加载视频和打开摄像头
  4. 海量数据库解决方案2011030401
  5. poj3311 经典tsp问题
  6. MySQL全文索引模糊查询_mysql全文索引之模糊查询
  7. Java工作笔记-使用IDEA开始我的第一个Spring项目
  8. 设计数据密集型应用-C5-主从架构及同步延迟问题
  9. mysql命令行大全
  10. 知道经纬度坐标怎么计算两点间距离_【我的时间拣屎】亚里士多德:地球是圆的,我计算了地球的圆周...
  11. kaggle实战_3模型分析与模型融合
  12. CRACK秘籍之爆破
  13. ServerSocket与Socket入门详解
  14. 计算机二级Python第二弹课后题来袭!冲冲冲!!!
  15. java利用数组求平均值_Java程序使用数组计算平均值
  16. 怎么取消苹果订阅自动续费?教你一招,2分钟搞定!
  17. 连续两次入围Gartner魔力象限的Quick BI到底有何魔力?
  18. AIRPLAY 协议研究
  19. 汇编指令 int 21 h 调用
  20. SAP CRM BOL collection find_by_property

热门文章

  1. 【相机标定】四个坐标系之间的变换关系
  2. CAPSNET:具有自我注意路由的胶囊网络
  3. 超牛EXCEL操作技巧,用的好,会涨工资哦
  4. LightOJ 1095 Arrange the Numbers(容斥原理)
  5. 微信小程序获取页面栈
  6. Zabbix安装配置(CentOS7.3)
  7. sqlite3 解决并发读写冲突的问题
  8. Zabbix-03-3 告警变量值
  9. 奕新集团--RAC环境后续
  10. Sweeter Than Fiction - Taylor Swift