正解:贪心
解题报告:
先考虑如果只有一列怎么搞?那就肯定是尽量走到最远的地方
然后用点儿类似的思想,现在考虑有两列的情况QAQ
为了方便表述,这里给每个位置两个值,a表示离一号入口的距离,b表示离二号入口的距离
可以先把从一号入口进去的安排了,所以考虑按体力从小往大考虑,然后在能满足a的情况下尽量选b比较大的位置
然后再处理二号入口的,就按体力从大往小考虑一下就好
具体实现的话就先把所有坐标按a排序,然后满足的就加入堆,堆的内部按b排序就好
over
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
const int N=10000+100;
int n,m,k,a[N],nw=1,nod_cnt;
struct node{int x,y,disa,disb;}nod[N];
il bool operator < (node gd,node gs){return gd.disb<gs.disb;}
priority_queue<node>Q;
il int read()
{
rc ch=gc;ri x=0;rb y=1;
while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
if(ch=='-')ch=gc,y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
return y?x:-x;
}
il bool cmp(node gd,node gs){return gd.disa<gs.disa;}
il bool cmq(ri gd,ri gs){return gd>gs;}
int main()
{
// freopen("720a.in","r",stdin);freopen("720a.out","w",stdout);
n=read();m=read();rp(i,1,n)rp(j,1,m)nod[++nod_cnt]=(node){i,j,i+j,i+m+1-j};sort(nod+1,nod+1+nod_cnt,cmp);
k=read();rp(i,1,k)a[i]=read();sort(a+1,a+1+k);
rp(i,1,k){while(a[i]>=nod[nw].disa && nw<=nod_cnt)Q.push(nod[nw++]);if(Q.empty())return printf("NO\n"),0;Q.pop();}
while(nw<=nod_cnt)Q.push(nod[nw++]);
k=read();rp(i,1,k)a[i]=read();sort(a+1,a+1+k);
// printf("nmdwsm??? %d\n",Q.size());
// while(!Q.empty())printf("%d\n",Q.top().disb),Q.pop();
my(i,k,1){if(a[i]<Q.top().disb)return printf("NO\n"),0;Q.pop();}//printf("dis=%d\n",Q.top().disb);}
printf("YES\n");
return 0;
}