很神奇的构造题…
首先有一个结论,就是当给定数列的奇数的个数大于2的时候,就无解
然后把奇数放在两端,输出 A1−1,A2…Am−1,Am+1 就好了
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=110;
int n,m,a[N],b[N];
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
int iodd=0;
for(int i=1;i<=m;i++)
scanf("%d",&a[i]),iodd+=(a[i]&1);
if(m==1){
if(a[1]==1) printf("%d\n1\n%d\n",1,1);
else printf("%d\n2\n%d %d\n",a[1],a[1]-1,1);
return 0;
}
if(iodd>2) puts("Impossible");
else{
for(int i=2;i<=m;i++)
if(a[i]&1) (a[1]&1)?swap(a[m],a[i]):swap(a[1],a[i]);
int t=0; if(a[1]>1) b[++t]=a[1]-1;
for(int i=2;i<m;i++) b[++t]=a[i];
b[++t]=a[m]+1;
for(int i=1;i<=m;i++) printf("%d ",a[i]); putchar('\n');
printf("%d\n",t);
for(int i=1;i<=t;i++) printf("%d ",b[i]);
}
return 0;
}