我写了一个奇怪的做法,本机过了所有样例,结果交上去发现甚至没过第一个样例
在 CF 的 custom test 里面 debug 了 10min 没弄出来,求问原因
#include<cstdio>
#include<iostream>
#include<fstream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define Set(a) memset(a,0,sizeof(a))
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define openf(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
#define re register
#define ri re int
#define il inline
typedef long long ll;
typedef unsigned long long ull;
template<typename T> inline T rd(T& x)
{
T f=1;x=0;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(T)(c-'0');
x*=f;
return x;
}
ll rd(){ll x;rd(x);return x;}
const int inf=1<<30;
#define debug printf("%d\n",__LINE__)
#define out(x,nn) {F(sadh,1,nn) cout<<(x[sadh])<<' ';puts("");}
const int N=2005;
const int M=N*N;
typedef long double ld;
int n;
struct seg{ld l,r,y;}a[N];
bool operator<(seg x,seg y){return x.y>y.y;}
ld calc(ld k)
{
ld l=1e13,r=-1e6;
F(i,1,n) {ld l0=a[i].l+k*a[i].y,r0=a[i].r+k*a[i].y;if(l0<l) l=l0;if(r0>r) r=r0;}
return r-l;
}
ld l[M/2],r[M/2],lsh[M];
int aa[M],b[M];
int main()
{
n=rd();
F(i,1,n) {a[i].l=rd();a[i].r=rd();a[i].y=rd();}
ld k0=0;
//debug;
//3-find start
{
ld l=1e-7,r=1e7;
F(i,1,200)
{
ld mid1=(2*l+r)/3,mid2=(2*r+l)/3;
if(calc(mid1)<calc(mid2)) r=mid2;
else l=mid1;
//debug;
}
k0=l;
}
//3-find finish
//debug;
sort(a+1,a+n+1);int tot=0;
F(i,1,n) F(j,i+1,n) if(fabs(a[i].y-a[j].y)>1e-3)
{
ld l0=(a[i].r-a[j].l)/(a[j].y-a[i].y),r0=(a[j].r-a[i].l)/(a[i].y-a[j].y);
// k >= r0 or k <= l0
// minimize max(r+ky)-min(l+ky) -> valley
l[++tot]=l0;r[tot]=r0;lsh[2*tot-1]=l[tot];lsh[2*tot]=r[tot];
}
if(tot==0) {printf("%.9Lf\n",calc(0));return 0;}
//debug;out(l,tot);out(r,tot);
sort(lsh+1,lsh+2*tot+1);int m=unique(lsh+1,lsh+2*tot+1)-lsh-1;
//debug;out(lsh,m);
F(i,1,tot) {int l1=lower_bound(lsh+1,lsh+m+1,l[i])-lsh,r1=lower_bound(lsh+1,lsh+m+1,r[i])-lsh;aa[l1+1]=max(aa[l1+1],r1-1);}
//debug;out(aa,m);
F(i,1,m) b[i]=1;
int rb=0;F(i,1,m) {rb=max(rb,aa[i]);if(rb>=i) b[i]=0;}
//debug;out(b,m);
int pos=lower_bound(lsh+1,lsh+m+1,k0)-lsh;
//debug;
// lsh[pos]<=k0<lsh[pos+1]
int left=pos;while(b[left]==0) --left;
int right=pos+1;while(b[right]==0) ++right;
//debug;printf("%d %d\n",left,right);
ld xx=calc(lsh[left]),yy=calc(lsh[right]);
//printf("%Lf %Lf\n",xx,yy);
if(lsh[left]<=0) printf("%.9Lf\n",yy);
else printf("%.9Lf\n",min(xx,yy));
return 0;
}