关于刚刚的 CF 2E
  • 板块学术版
  • 楼主WYXkkZzz Zzz
  • 当前回复19
  • 已保存回复19
  • 发布时间2020/7/31 00:45
  • 上次更新2023/11/6 21:43:00
查看原帖
关于刚刚的 CF 2E
130151
WYXkkZzz Zzz楼主2020/7/31 00:45

我写了一个奇怪的做法,本机过了所有样例,结果交上去发现甚至没过第一个样例

在 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;
}
2020/7/31 00:45
加载中...