[构造] Atcoder AGC001 D. Arrays and Palindrome

来源:互联网 发布:怎样删除淘宝评价 编辑:程序博客网 时间:2024/06/07 03:45

很神奇的构造题…

首先有一个结论,就是当给定数列的奇数的个数大于2的时候,就无解

然后把奇数放在两端,输出 A11,A2Am1,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;}