#18676. Planting Trees 题解

题目链接:#18676. Planting Trees

简单构造题。对于 $ b $ 为奇数显然无解,对于 $ b>0 $ 可以构造一个一条链然后交替在上下挂一个点解决奇数然后在后面延长链解决偶数,对于 $ b=0 $ 对于 $ a%3 $ 分讨,发现一个环是合法的,对于三种构造一个环然后再右下角增加 $ _| $ 即可。

代码:

#include<bits/stdc++.h>
#define time(null) chrono::steady_clock::now().time_since_epoch().count()
#define int long long
#define uint unsigned long long
#define debug() cout<<"come here\n"
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pb push_back
#define Code return
#define by 0
#define MCYYDS ;
using namespace std;
int qpow(int a,int b,int p=INF){int ret=1;while(b){if(b&1)ret=(ret*a)%p;a=(a*a)%p;b>>=1;}return ret;}
inline int read(){int ret=0,f=1;char ch=getchar();while(ch<'0'||ch>'9')f=(ch=='-'?-1:f),ch=getchar();while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+(ch^48),ch=getchar();return ret*f;}
inline void write(int x){if(x<0){putchar('-');write(-x);return ;}if(x>9)write(x/10);putchar((char)(x%10+48));}
inline void writech(int x,char ch){write(x);putchar(ch);}
int ans[205][205];
signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	int a=read(),b=read();
	if(b&1)
	{
		puts("NO");
		return 0;
	}
	if(b>0)
	{
		ans[2][1]=1;
		for(int i=2;i<=b/2;i++)
		{
			ans[2][i]=1;
			ans[(i&1?1:3)][i]=1;
		}
		for(int i=b/2+1;i<=b/2+1+a;i++)
		{
			ans[2][i]=1;
		}
		puts("YES");
		writech(3,' ');
		writech(b/2+a+1,'\n');
		for(int i=1;i<=3;i++)
		{
			for(int j=1;j<=b/2+a+1;j++)
			{
				putchar(ans[i][j]?'O':'.');
			}
			puts("");
		}
	}
	else
	{
		if(a%3==1)
		{
			for(int i=1;i<=a/3+1;i++)
			{
				ans[i][i]=1;
				ans[i][i-1]=ans[i-1][i]=1;
			}
			puts("YES");
			writech(a/3+1,' ');
			writech(a/3+1,'\n');
			for(int i=1;i<=a/3+1;i++)
			{
				for(int j=1;j<=a/3+1;j++)
				{
					putchar(ans[i][j]?'O':'.');
				}
				puts("");
			}
		}
		if(a%3==2)
		{
			if(a<8)puts("NO");
			else
			{
				ans[1][1]=ans[1][2]=ans[1][3]=ans[2][1]=ans[2][3]=ans[3][1]=ans[3][2]=ans[3][3]=1;
				for(int i=4;i<=a/3+1;i++)
				{
					ans[i][i]=1;
					ans[i][i-1]=ans[i-1][i]=1;
				}
				puts("YES");
				writech(a/3+1,' ');
				writech(a/3+1,'\n');
				for(int i=1;i<=a/3+1;i++)
				{
					for(int j=1;j<=a/3+1;j++)
					{
						putchar(ans[i][j]?'O':'.');
					}
					puts("");
				}
			}
		}
		if(a%3==0)
		{
			if(a<12)puts("NO");
			else
			{
				ans[1][1]=ans[1][2]=ans[1][3]=ans[1][4]=ans[2][1]=ans[2][4]=ans[3][1]=ans[3][4]=ans[4][1]=ans[4][2]=ans[4][3]=ans[4][4]=1;
				for(int i=5;i<=a/3;i++)
				{
					ans[i][i]=1;
					ans[i][i-1]=ans[i-1][i]=1;
				}
				puts("YES");
				writech(a/3,' ');
				writech(a/3,'\n');
				for(int i=1;i<=a/3;i++)
				{
					for(int j=1;j<=a/3;j++)
					{
						putchar(ans[i][j]?'O':'.');
					}
					puts("");
				}
			}
		}
	}
	Code by MCYYDS
}

posted @ 2026-08-13 10:04  MCYYDS  阅读(15)  评论(0)    收藏  举报