题面

传送门

简要题意:给出\(n\)个点,请求出两条直线,并最小化每个点到离它最近的那条直线的距离的平方和,\(n\leq 100\)

orz Shinbokuow

前置芝士

给出\(n\)个点,请求出一条直线,使所有点到它距离的平方和最小,点带插入和删除

如果我们设\(y=kx+b\),设点\(i\)为\((x_i,y_i)\),那么就是要求我们最小化

\[\begin{aligned}
Ans
&=\sum_{i=1}^n{(kx_i-y_i+b)^2\over k^2+1}\\
&=\sum_{i=1}^n{k^2x_i^2+y_i^2+b^2-2kx_iy_i+2kbx_i-2by_i\over k^2+1}\\
&={1\over k^2+1}\left(k^2\sum_{i=1}^nx_i^2+\sum_{i=1}^ny_i^2+nb^2-2k\sum_{i=1}^nx_iy_i+2kb\sum_{i=1}^nx_i-2b\sum_{i=1}^ny_i\right)
\end{aligned}
\]

我们令这个柿子为\(f(k,b)\),也就是说这是一个以\(k,b\)为自变量的函数

接下来,我们用拉格朗日乘数法对\(b\)求偏导数

上面这话说的简直不是人话,翻译一下的话,可以理解为,我们假设\(k\)是一个定值\(k_0\),并认为\(b\)是变量,对它求导。导数为\(0\)的点就是当\(k=k_0\)时的极大或极小值(因为这里函数可以无限大所以肯定是极小值),那么显然对于任意一个\(k\)都有一个最优的\(b\),且\(b\)是一个关于\(k\)的一次函数,我们把\(b\)代入就行了

也就是说

\[{\partial f\over \partial b}={1\over k^2+1}\left(2nb+2k\sum_{i=1}^nx_i-2\sum_{i=1}^ny_i\right)=0
\]

如果我们令

\[\overline{x}={1\over n}\sum_{i=1}^nx_i,\overline{y}={1\over n}\sum_{i=1}^ny_i
\]

那么\(b\)就可以表示为

\[b=\overline{y}-k\overline{x}
\]

然后我们把代入原式,可以解得

\[f(k,b)={Ak^2+Bk+C\over k^2+1}
\]

其中

\[A=\sum x_i^2-{(\sum x_i)^2\over n}
\]

\[B={2\sum x_i\sum y_i\over n}-2\sum x_iy_i
\]

\[C=\sum y_i^2-{(\sum y_i)^2\over n}
\]

然后我们要求\(f(k,b)\)的最小值,移项之后可以得到

\[(A-f(k,b))k^2+Bk+C-f(k,b)=0
\]

以下我们设\(\alpha=f(k,b)\)。因为这里需要保证\(k\)有解,也就是说

\[B^2-4(A-\alpha)(C-\alpha)\geq 0
\]

整理之后有

\[-4\alpha^2+4(A+C)\alpha+B^2-4AC\geq 0
\]

数形结合一下发现左边是个开口向下的二次函数,与\(x\)轴有一个或两个交点,那么我们取小一点的那个就好了

等会儿?万一这个二次函数最大值小于\(0\)呢?那不就无解了么?

实际上是不会的,可以用两种方法考虑

感性理解:想一想它代表的意义,再看看我手里的锤子,您说有没有解?

数学方法:因为我们考虑二次函数\(ax^2+bx+c=0\),它的最值为\({4ac-b^2\over 4a}\),那么代入之后可以发现哪个二次函数的最大值为

\[\begin{aligned}
{4\times -4\times (B^2-4AC)-16(A+C)^2\over -16}
&=B^2-4AC+(A+C)^2\\
&=B^2+(A-C)^2\geq 0
\end{aligned}
\]

所以肯定有解啦!

于是我们就可以做到\(O(1)\)插入,\(O(1)\)删除了

题解

然后是题解了……

对于两条直线,它们两个的两条垂直的角平分线会把平面分成四个部分,其中两个相对的区域离一个平面比较近,另外两个相对的区域离另一条平面比较近

但是枚举角平分线这件事情就会变得非常辣手……

我们可以枚举点对\(a,b\),并令直线\(ab\)为第一条角平分线,钦定\(a\)在其中一端,\(b\)在另一端,那么不难发现我们这样枚举其实等价于枚举完了所有的角平分线

然后第一条角平分线就解决了,接下来是和它垂直的第二条

我们计算出每个点在第一条角平分线上的投影长度,然后按投影长度排个序,那么第二条角平分线对平面的分割只有\(O(n)\)种情况,直接找过去就可以了

复杂度\(O(n^3\log n)\),其中\(O(n\log n)\)是排序的复杂度

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=105;const double eps=1e-10;
inline int sgn(R double x){return x<-eps?-1:x>eps;}
struct node{
double x,y;
inline node(){}
inline node(R double xx,R double yy):x(xx),y(yy){}
inline node operator +(const node &b)const{return node(x+b.x,y+b.y);}
inline node operator -(const node &b)const{return node(x-b.x,y-b.y);}
inline double operator *(const node &b)const{return x*b.y-y*b.x;}
inline node operator *(const double &b)const{return node(x*b,y*b);}
inline double operator ^(const node &b)const{return x*b.x+y*b.y;}
}p[N],v;
struct qwq{
node p;double d;bool in;
inline qwq(){}
inline qwq(R node pp,R double dd,R bool ii):p(pp),d(dd),in(ii){}
inline bool operator <(const qwq &b)const{return d<b.d;}
}st[N];
struct Line{
double x,y,xx,yy,xy;int sz;
inline void ins(R node p){x+=p.x,y+=p.y,xx+=p.x*p.x,yy+=p.y*p.y,xy+=p.x*p.y,++sz;};
inline void del(R node p){x-=p.x,y-=p.y,xx-=p.x*p.x,yy-=p.y*p.y,xy-=p.x*p.y,--sz;};
inline void clr(){x=y=xx=yy=xy=sz=0;}
double calc(){
if(!sz)return 0;
double xa=x/sz,ya=y/sz,A=xx-sz*xa*xa;
double B=2*xa*ya*sz-2*xy,C=yy-sz*ya*ya;
double a=4,b=-4*(A+C),c=4*A*C-B*B;
return (-b-sqrt(b*b-4*a*c))/(a*2);
}
}l1,l2;
double res=1e18;int n;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
fp(i,1,n)scanf("%lf%lf",&p[i].x,&p[i].y);
fp(a,1,n)fp(b,1,n)if(a!=b){
v=p[b]-p[a];
fp(i,1,n)st[i]=qwq(p[i],v^(p[i]-p[a]),v*(p[i]-p[a])>eps);
st[a].in=1;
sort(st+1,st+1+n),l1.clr(),l2.clr();
fp(i,1,n)st[i].in?l1.ins(st[i].p):l2.ins(st[i].p);
cmin(res,l1.calc()+l2.calc());
fp(i,1,n){
if(st[i].in)l1.del(st[i].p),l2.ins(st[i].p);
else l2.del(st[i].p),l1.ins(st[i].p);
cmin(res,l1.calc()+l2.calc());
}
}
printf("%.10lf\n",res/n);
return 0;
}

CodeChef TWOROADS(计算几何+拉格朗日乘数法)的更多相关文章

  1. BZOJ3775: 点和直线(计算几何+拉格朗日乘数法)

    题面 传送门 题解 劲啊-- 没有和\(Claris\)一样推,用了类似于\(Shinbokuow\)推已知点求最短直线的方法,结果\(WA\)了好几个小时,拿\(Claris\)代码拍了几个小时都没 ...

  2. [Math & Algorithm] 拉格朗日乘数法

    拉格朗日乘数法(Lagrange Multiplier Method)之前听数学老师授课的时候就是一知半解,现在越发感觉拉格朗日乘数法应用的广泛性,所以特意抽时间学习了麻省理工学院的在线数学课程.新学 ...

  3. 《University Calculus》-chaper12-多元函数-拉格朗日乘数法

    求解条件极值的方法:拉格朗日乘数法 基于对多元函数极值方法的了解,再具体的问题中我们发现这样一个问题,在求解f(x,y,z)的极值的时候,我们需要极值点落在g(x,y,z)上这种对极值点有约束条件,通 ...

  4. bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)

    题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...

  5. ML(附录4)——拉格朗日乘数法

    基本的拉格朗日乘子法(又称为拉格朗日乘数法),就是求函数 f(x1,x2,...) 在 g(x1,x2,...)=C 的约束条件下的极值的方法.其主要思想是引入一个新的参数 λ (即拉格朗日乘子),将 ...

  6. BZOJ2876 [Noi2012]骑行川藏 【拉格朗日乘数法】

    题目链接 BZOJ 题解 拉格朗日乘数法 拉格朗日乘数法用以求多元函数在约束下的极值 我们设多元函数\(f(x_1,x_2,x_3,\dots,x_n)\) 以及限制\(g(x_1,x_2,x_3,\ ...

  7. 拉格朗日乘数法 和 KTT条件

    预备知识 令 \(X\) 表示一个变量组(向量) \((x_1, x_2, \cdots, x_n)\) 考虑一个处处可导的函数 \(f(X)\), 为了方便描述, 这里以二元函数为例 对于微分, 考 ...

  8. CodeForces - 813C The Tag Game(拉格朗日乘数法,限制条件求最值)

    [传送门]http://codeforces.com/problemset/problem/813/C [题意]给定整数a,b,c,s,求使得  xa yb zc值最大的实数 x,y,z , 其中x ...

  9. Wannafly模拟赛2 B river(拉格朗日乘数法)

    题目 https://www.nowcoder.com/acm/contest/4/B题意 有n条南北流向的河并列排着,水流速度是v,现在你需要从西岸游到东岸,总共T个时间,你的游泳速度是u,问东岸的 ...

随机推荐

  1. Spring框架的事务管理之基于AspectJ的注解方式(重点掌握,最简单的方式)

    1. 步骤一:恢复转账的开发环境(具体开发环境实现见:https://www.cnblogs.com/wyhluckdog/p/10137283.html)2. 步骤二:applicationCont ...

  2. Spring框架的配置文件分开管理(了解)

    1. 例如:在src的目录下又多创建了一个配置文件,现在是两个核心的配置文件,那么加载这两个配置文件的方式有两种! * 主配置文件中包含其他的配置文件: <import resource=&qu ...

  3. DOMNodeInserted监听div内容改变

    $('.cw-icon .ci-count').on('DOMNodeInserted',function(){ $(".settleup-content .cont_loading&quo ...

  4. PowerDesigner :

    P:是否为主键: F:是否为外键: M:表示强制非空: D:是否在模型中显示 修改样式.字体.颜色.等:Tools->Display Preferences->Format-> Po ...

  5. laravel表单图片上传

    1.视图 2.控制器

  6. 用pyqt5做一个能python程序能插入图片的ide

    之前只是放到github上了,现在一想应该开源,大家想继续做好这个ide的都能从这里起步. #注意在.py文件相同目录下放一个1.png做测试图片 #本质就是用html来实现图片 #写在前面的话:这个 ...

  7. spring mvc 默认页面

    只需要在servlet.xml页面中添加如下配置: <mvc:view-controller path="/" view-name="login"/> ...

  8. 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)

    传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...

  9. hdu-1129(模拟题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1129 注意:c_code[i]=(p_code[i*k%n]-i)%28; #include<i ...

  10. UVa 12545 Bits Equalizer (贪心)

    题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作. 析:先说我的思路,我看到这应该是贪心,首先,如果先判断s能不能变成t, ...