#二分# [luogu 蒟蒻夢想-CSP考前加油賽]畫地爲佬

題目

https://www.luogu.org/problem/U92904?contestId=23574


解題思路

我們可以二分一個最大正方形的邊長xx,然後不斷用剩下的邊長填補正方形,第一次補33,第2x2-x22


代碼

#include<cmath>
#include<cstdio> 
#include<algorithm>
#define ll long long
using namespace std; 
ll T,m; 
int main(){
	scanf("%lld",&T); 
	while(T--){
		scanf("%lld",&m); 
		ll l=1,r=sqrt(m),w=0; 
		while(l<r){
			ll mid=(l+r)/2; 
			if (m-(mid+1)*mid*2>=0) l=mid+1; else r=mid; 
		}
		ll g=(l-1); 
		m-=(g+1)*g*2; w=g*g; 
		while (m>=2&&w>=1){
			if (m>=3) m-=3,w++; else break;
			if (m>=2) w+=min(g-1,m/2),m-=min(2*g-2,m); 
		}
		printf("%lld\n",w); 
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章