这个题,哎,想了一天,先入为主的思想严重,四个边角是关键,除去四个边角影响两个边,剩下的n-2个点是不会相互影响的,这些都容易想到,然后想反过来搞,先假设四边都黑,删去某些点,但是,反着搞没有使得问题简化,然后正着来,希望用一种贪心的思想来做,先考虑填满n-2个点,在考虑边角,按逆时针逐次的考虑,但是这样能不能成功需要运气,贪心策略试了不少,但都有漏洞。那么,改变一下,先考虑边角,再考虑n-2个点,那么,边角只有四个,可以用状态压缩的思想,0表示不填,1表示填,四位二进制数就可以模拟所有情况,这点想到了,就都顺利成章了。
这个题烦人的地方就是我们往往喜欢先考虑不变的n-2个点,再用剩下的边角来充当贪心的筹码,结果会陷进思维陷阱里,运气好了可以上岸,但往往难以弥补漏洞,交换一下考虑顺序,交换的依据是四个边角点所能组成的情况很少,只有16种。
#include <bits/stdc++.h>
//#define int long long
#define ioss ios::sync_with_stdio(0), cin.tie(0)
using namespace std;
template <class cl>
void read(cl &x)
{
x = 0;
int f = 0;
char ch;
ch = getchar();
while (!isdigit(ch))
{
f = f | (ch == '-'), ch = getchar();
}
while (isdigit(ch))
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x = f ? -x : x;
return;
}
template <class cl>
void put(cl x)
{
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
put(x / 10);
putchar(x % 10 + '0');
return;
}
int n;
int a[5];
int x[5];
int flag;
inline void to()
{
read(n);
for(int i=0;i<=3;i++)
{
read(a[i]);
}
for(int i=0;i<(1<<4);i++)
{
for(int j=0;j<4;j++)
{
x[j]=a[j];
}
for(int j=0;j<=3;j++)
{
if((1<<j)&i)
{
x[j]--;
x[(j-1+4)%4]--;
}
}
flag=0;
for(int j=0;j<=3;j++)
{
if(x[j]<0)
{
flag=1;break;
}
else if(x[j]>n-2)
{
flag=1;break;
}
}
if(flag==0)
{
puts("yes");
return ;
}
}
puts("no");
return ;
}
signed main()
{
int t;
read(t);
while(t--)
{
to();
}
return 0;
}