나무 심기

나무 심기

考虑对每个点的 \(\text{deg}\) 求和,得到的结果必然为偶数,由此得出 \(B\) 为偶数。

考虑 \(B \geq 2\) 的情况,其构型如图:

image

其中红色是苹果,粉色是桃子,接下来我们默认 \(B=0\)

考虑 \(A=8,10,12,\dots\),如图:

image

对于 \(A=4\),如图:

image

对于 \(A=2,6\),我们声称其无解。

对于 \(A=11,13,15,\dots\),如图:

image

对于 \(A=7\),如图:

image

对于 \(A=1\),如图:

image

对于 \(A=3,5,9\),我们声称其无解。

//Ad astra per aspera
#include<iostream>
#include<cstdio>
using namespace std;
char ch[210][210];
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	if(b%2==1){
		printf("NO\n");
		return 0;
	}
	if(b>=2){
		int n=3,m=a+b/2+1;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				ch[i][j]='.';
			}
		}
		for(int i=1;i<=m;i++){
			ch[2][i]='O';
		}
		for(int i=2;i<=b/2;i++){
			if(i%2==0){
				ch[1][i]='O';
			}
			else{
				ch[3][i]='O';
			}
		}
		printf("YES\n");
		printf("%d %d\n",n,m);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				printf("%c",ch[i][j]);
			}
			printf("\n");
		}
		return 0;
	}
	if(a%2==0){
		if(a==2){
			printf("NO");
		}
		else if(a==4){
			printf("YES\n"); 
			printf("2 2\n");
			printf("OO\n");
			printf("OO");
		}
		else if(a==6){
			printf("NO");
		}
		else{
			int n=3,m=a/2-1;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					ch[i][j]='.';
				}
			}
			for(int i=1;i<=m;i++){
				ch[1][i]='O';
				ch[3][i]='O';
			}
			ch[2][1]='O';
			ch[2][m]='O';
			printf("YES\n");
			printf("%d %d\n",n,m);
			for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					printf("%c",ch[i][j]);
				}
				printf("\n");
			}
		}
	}
	else{
		if(a==1){
			printf("YES\n");
			printf("1 1\n");
			printf("O");
		}
		else if(a==3){
			printf("NO");
		}
		else if(a==5){
			printf("NO");
		}
		else if(a==7){
			printf("YES\n"); 
			printf("3 3\n");
			printf("OO.\n");
			printf("OOO\n");
			printf(".OO");
		}
		else if(a==9){
			printf("NO");
		}
		else{
			int n=4,m=(a-3)/2;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					ch[i][j]='.';
				}
			}
			for(int i=1;i<m;i++){
				ch[1][i]='O';
				ch[3][i]='O';
			}
			ch[2][1]='O';
			ch[2][m-1]='O';
			ch[3][m]='O';
			ch[4][m-1]='O';
			ch[4][m]='O';
			printf("YES\n");
			printf("%d %d\n",n,m);
			for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					printf("%c",ch[i][j]);
				}
				printf("\n");
			}
		}
	}
	return 0;
}
posted @ 2026-08-08 16:17  Oken喵~  阅读(3)  评论(0)    收藏  举报