CF1850E题解

先将 cc 减去 i=1nsi\displaystyle\sum_{i=1}^n s_i,那么得到的 cc 就是空白部分的总面积。

接下来考虑怎么求空白部分的总面积

将每个图片抽象成上图,红色部分的面积就是空白部分的面积。

蓝色的线就表示空白部分的宽 ww,由图可得 Si=4×w2+4×w×siS_{i}=4\times w^2+4\times w \times s_iSiS_{i} 表示第 ii 张图的空白部分的面积)。

那么,空白部分的总面积为

i=1nSi=i=1n4×w2+4×w×si\displaystyle\sum_{i=1}^n S_i=\displaystyle\sum_{i=1}^n 4\times w^2+4\times w \times s_i                   =4×n×w2+4×w×i=1nsi\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =4\times n\times w^2+4\times w\times \displaystyle\sum_{i=1}^n s_i

其中 i=1nsi\displaystyle\sum_{i=1}^n s_i 可以预处理得到。

显然,i=1nSi\displaystyle\sum_{i=1}^n S_i 具有单调性,考虑二分答案 ww,套用上面的公式算即可。

#include<bits/stdc++.h>
using namespace std;
int t,n,s[200010];
long long c;
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%lld",&n,&c);
		long long o=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&s[i]);
			c-=1ll*s[i]*s[i];
			o+=1ll*s[i];
		}
		long long l=1,r=c+1;
		while(l<r-1){
			long long mid=l+r>>1;
			if(c/mid/4/n<mid){
				r=mid;
				continue;
			}
			long long h=c-1ll*mid*mid*4*n;
			if(h/o/4<mid){
				r=mid;
				continue;
			}
			l=mid;
		}
		printf("%lld\n",l);
	}
	return 0;
}
posted @ 2023-07-23 11:32  fengxiaoyi  阅读(34)  评论(0)    收藏  举报  来源