题目链接
题目大意
给出你一个n*n的矩阵,一开始都是一种颜色,让你在其最上,右,下,左.上对其颜色进行图色,给出你其涂色的块数问是否能够涂成符合要求的.
思路
u(上),(d)下,l(左),r(右)
首先我们看当u == n时那么就说明,l和r需要用掉一个移到他俩的最上方,同样d如果也等于n.l和r也要都用掉一个移到他俩最下方.这时就需要判断l和r是否可行.
第二种就是u如果等于n-1那么说明l和r需要有一个要用掉一个,d也一样,结合上面所说的也就是其实我们.只需要判断l+r的数量大于等于((u=n的数量)+(d=n的数量)) * 2[也就是l和r都需要占用的数量]+((u=n-1的数量)+(d=n-1的数量))[就是l和r只需要用一个的数量].
同理 l和r也是向上面那样判断即可.
#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<ll,ll> pii;
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn=2e5+1010;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=998244353;
const int MOD=10007;
inline int read() {
int x=0;
bool t=false;
char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
/*
vector<ll> m1;
vector<ll> m2;
priority_queue<ll , vector<ll> , greater<ll> > mn;//上 小根堆 小到大
priority_queue<ll , vector<ll> , less<ll> > mx;//下 大根堆 大到小
*/
map<ll,ll>mp;
map<ll,ll>mpp;
ll n,u,d,r,l;
#define read read()
int main() {
ll t;
cin>>t;
while(t--) {
cin>>n>>u>>r>>d>>l;
ll u1,u2,l1,l2;
bool flag=1;
u1=u2=l1=l2=0;
if(u==n) u2++;
if(d==n) u2++;
if(u==n-1) u1++;
if(d==n-1) u1++;
if(l<u2||r<u2) flag=0;
if(l+r<2*u2+u1) flag=0;
if(l==n) l2++;
if(r==n) l2++;
if(l==n-1) l1++;
if(r==n-1) l1++;
if(u<l2||d<l2) flag=0;
if(u+d<2*l2+l1) flag=0;
if(flag) puts("YES");
else puts("NO");
}
return 0;
}