预测在mid天完成任务的最晚种树日期计算错误,求调
查看原帖
预测在mid天完成任务的最晚种树日期计算错误,求调
1080857
wanglongye楼主2024/10/13 22:17

下面代码相当于题解中包含 clacclac 函数的二分(即求标题所说的东西),midmid 含义如标题所示, ai,bi,cia_i,b_i,c_i 如题目所示,c0c0 表示当 ci<0c_i<0 时最靠后的满足树长得高度大于等于 11 米的日期。我对照了第一篇题解(我的 md,mid,c0md,mid,c0 分别和题解的 l,r,Tl,r,T 差不多),不知道我这么写为什么不对(尽管这里可能写对了,如果这里我写对了记得给我说一声),求调,谢谢!

for(int i=1;i<=n;i++) {
	t[i].x=i;
	if(c[i]>=0) {
		long long l=1,r=mid,md;
		while(l<=r) {
			md=(l+r)/2;
			if(c[i]*(md+mid)/inf*(mid-md+1)>inf||b[i]*(mid-md+1)+c[i]*(md+mid)*(mid-md+1)/2>=a[i]) l=md+1;
			else r=md-1;
		}
		if(!r) return false;
		t[i].y=r;
	}
	else {
		long long c0=(b[i]-1)/(-c[i]);
		if(mid<=c0) {
			long long l=1,r=mid,md;
			while(l<=r) {
				md=(l+r)/2;
				if(b[i]*(mid-md+1)+c[i]*(md+mid)*(mid-md+1)/2<a[i]) r=md-1;
				else l=md+1;
			}
			if(!r) return false;
			t[i].y=r;
		} else {
			if(a[i]<=mid-c0) t[i].y=mid-a[i]+1;
			else {
				long long l=1,r=c0,md;
				while(l<=r) {
					md=(l+r)/2;
					if(b[i]*(c0-md+1)+c[i]*(md+c0)*(c0-md+1)/2+mid-c0<a[i]) r=md-1;
					else l=md+1;
				}
				if(!r) return false;
				t[i].y=r;
			}
		}
	}
}
2024/10/13 22:17
加载中...