#include #include #include #include #include using namespace std; //一回合只敲2个格子,只有在两边才可能被击中 //正常在中间走就不会出事,除非有连击逼到边上 //dp,一开始所有格都是1,1会往两边蔓延,只有被hit变成0,只有hit两端才可能有意义,1一定在中间连着,双指针维护两侧的端点优化dp int main(){ int n,q; cin>>n>>q; vector a(q+1); vector b(q+1); for(int i=1;i<=q;i++){ cin>>a[i]; } for(int i=1;i<=q;i++){ cin>>b[i]; } vector> vm(q+1); //用于回溯 int h=1;int t=n; for(int r=1;r<=q-1;r++){ set id; id.insert(a[r]);id.insert(b[r]); if(t==h){ if(id.count(t)==1){ cout<<"NO"<0){ vm[r+1][h-1]=h; } vm[r+1][t]=h; h--; }else{ if(h-1>0){ vm[r+1][h-1]=h; } h--; if(t+1<=n){ vm[r+1][t+1]=t; } t++; } }else{ //>=3 if(id.count(h)==1&&id.count(h+1)==1){ vm[r+1][h+1]=h+2; h++; }else if(id.count(h)==0&&h-1>0){ vm[r+1][h-1]=h; h--; } if(id.count(t)==1&&id.count(t-1)==1){ vm[r+1][t-1]=t-2; t--; }else if(id.count(t)==0&&t+1<=n){ vm[r+1][t+1]=t; t++; } if(t pos; int r=q; while(r>=1){ pos.push(rst); if(vm[r].find(rst)==vm[r].end()){ r--; }else{ rst=vm[r][rst]; r--; } } cout<