开这个专题时的第一个上午调了一上午多项式,然后进度就一直落后,后来狂追追回来了,所以掌握的不是很扎实。
我讨厌计算几何!!!
凸包其实就是那种斜率优化dp的感觉。多数情况下认为图包维护的是点凸包,而不是直线。
这个我一开始想的是直线,虽然可以做题,但是很多思路都很别扭,甚至和凸包不沾边。。。
还有的问题就是向量叉积来判方向,虽然好像可以用斜率直接替代,但是到了半平面交会吃亏,而且很不工业,所以最好改过来。
$(a,b)X(c,d)=ad-bc$。等于$0$表示平行。大于$0$表示$(a,b)$在$(c,d)$的逆时针方向,否则为顺时针方向。
这样就可以直接用凸包的三个点来判断方向,直接得知中间的那个点是否在凸包内了。
大致按照难度排序。
妖怪:
$Description:$
邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性。邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景。环境对妖怪的战斗力有很大影响,在某种环境中,妖怪可以降低自己k×a点攻击力,提升k×b点防御力或者,提升自己k×a点攻击力,降低k×b点防御力,a,b属于正实数,k为任意实数,但是atk和dnf必须始终非负。妖怪在环境(a,b)中的战斗力为妖怪在该种环境中能达到的最大攻击力和最大防御力之和。strength(a,b)=max(atk(a,b))+max(dnf(a,b))环境由a,b两个参数定义,a,b的含义见前文描述。比如当前环境a=3,b=2,那么攻击力为6,防御力为2的妖怪,能达到的最大攻击力为9,最大防御力为6。所以该妖怪在a=3,b=2的环境下战斗力为15。因此,在不同的环境,战斗力最强的妖怪可能发生变化。作为一名优秀的妖怪训练师,邱老师想发掘每一只妖怪的最大潜力,他想知道在最为不利的情况下,他的n只妖怪能够达到的最强战斗力值,即存在一组正实数(a,b)使得n只妖怪在该环境下最强战斗力最低。$1\le n \le 10^6, 0<atk,dnf \le10^8$
求最小值的最大值。二分答案解方程或三分$\frac{a}{b}$无脑做皆可。卡常卡精。带凸包的做法太过扯淡。。。且不提。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define eps 3e-6 4 int n,a[1000005],b[1000005]; 5 inline int read(){ 6 register int p=0;register char ch=getchar(); 7 while(ch<'0'||ch>'9')ch=getchar(); 8 while(ch>='0'&&ch<='9')p=(p<<3)+(p<<1)+ch-48,ch=getchar(); 9 return p; 10 } 11 int main(){ 12 scanf("%d",&n); 13 for(int i=1;i<=n;++i)a[i]=read(),b[i]=read(); 14 double l=0,r=4e8+5; 15 while(r-l>eps){ 16 double m=(l+r)/2.0,L=0,R=1e18; 17 for(int i=1;i<=n;++i){ 18 double A=a[i],B=a[i]+b[i]-m,C=b[i],D=B*B-4*A*C; 19 if(D<0){L=1e25;break;}D=sqrt(D)/2/A;double Z=-B/A/2; 20 if(Z-D>L)L=Z-D; 21 if(Z+D<R)R=D+Z; 22 if(L>R)break; 23 }if(L<R)r=m;else l=m; 24 }printf("%.4lf",l); 25 }