传送门

题目大意

给定一个元素和为$N$的有$M$个数的序列$A$,请你可以$A$元素排列的顺序,并需要构造一个有$K$个($K$可以自己定)数的数列,使得任意一个长度为$N$的字符串,若满足:前$A_1$字符是回文串,接下来$A_2$个字符是回文串,直到$最后A_M$个字符也是一个回文串,且对于$B$同样满足这个性质,则这个字符串一定只能由一种字符构成。

题解

考虑一个回文串实际是在每一对关于中心对称的两个位置之间连一条边,那么原题就变成了连边让所有位置连成一个连通块。

显然我们至少需要$n-1$条边,那么对于每一个$A_i$,它提供的边数是$\lfloor\frac{A_i}{n}\rfloor$,考虑到$\sum(A_i+B_i)=N$,那么$A_i,B_i$最多出现两个奇数,否则无解。

考虑$A_1$和$B_1$左对齐,我们只需要让$B_i=A_i\pm 1$,那么$B_i,A_i$这些位置就会被连城一个连通块。

考虑$A_i=B_i$但$B_i$相互错位了一个位置,画图发现当且仅当$A_i$是偶数时,这$A_i+1$个位置就能连成一个连通块。

由于奇数的情况不超过两个,那么可以直接把奇数放在两边,然后把$A$复制下来,最左边的数$-1$,最右边的数$+1$,把$0$过滤掉输出即可。

注意要特判$n,m=1$之类的情况

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 120
using namespace std;
namespace IO{
const int BS=(1<<20)+5; int Top=0;
char Buffer[BS],OT[BS],*OS=OT,*HD,*TL,SS[20]; const char *fin=OT+BS-1;
char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);} return (HD==TL)?EOF:*HD++;}
void flush(){fwrite(OT,1,OS-OT,stdout);}
void Putchar(char c){*OS++ =c;if(OS==fin)flush(),OS=OT;}
void write(int x){
if(!x){Putchar('0');return;} if(x<0) x=-x,Putchar('-');
while(x) SS[++Top]=x%10,x/=10;
while(Top) Putchar(SS[Top]+'0'),--Top;
}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
}
using namespace IO;
int n,m,p[M],tg,ct,tot,t[M];
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++) p[i]=read(),ct+=(p[i]&1);
if(ct>2){puts("Impossible");return 0;}
for(int i=2;i<=m;i++){
if(!(p[i]&1)) continue;
if(!(p[1]&1)) swap(p[1],p[i]);
else swap(p[m],p[i]);
}
if(n==1){puts("1\n1\n1\n");return 0;}
if(m==1){printf("%d\n2\n%d %d\n",p[1],1,p[1]-1);return 0;}
if(p[1]>1) t[tot=1]=p[1]-1;
for(int i=2;i<=m;i++) t[++tot]=p[i]; t[tot]++;
for(int i=1;i<=m;i++) printf("%d%c",p[i],i<m?' ':'\n');
printf("%d\n",tot);
for(int i=1;i<=tot;i++) printf("%d%c",t[i],i<tot?' ':'\n');
return 0;
}

Agc001_D Arrays and Palindrome的更多相关文章

  1. 【NOIP2017提高A组模拟9.12】Arrays and Palindrome

    [NOIP2017提高A组模拟9.12]Arrays and Palindrome[SPJ] 题目 Description Input Output Sample Input 1 6 Sample O ...

  2. AtCoder Grand Contest 001 D - Arrays and Palindrome

    题目传送门:https://agc001.contest.atcoder.jp/tasks/agc001_d 题目大意: 现要求你构造两个序列\(a,b\),满足: \(a\)序列中数字总和为\(N\ ...

  3. AtCoder AGC001D Arrays and Palindrome (构造)

    补一下原来做过的AtCoder思维题的题解 题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_d 先特判一些小的情况. 原题就相当于每个回文串 ...

  4. 【agc001d】Arrays and Palindrome

    Portal -->agc001D Description 给你一个\(m\)个数的排列\(A\),这个\(A\)中元素的顺序可以随便调换,\(A\)中的元素的和为\(n\),现在要你构造一个数 ...

  5. AGC001 D - Arrays and Palindrome【构造】

    把回文串的相等关系连一下,发现最后要求的是一笔画问题 注意到奇数长度的中间有一个单独没有连线的,所以a数组至多有两个奇数值 如果没有奇数,那么b在最前面放一个1,然后把a[1]~a[m-1]放上去,这 ...

  6. Atcoder Grand Contest 001 D - Arrays and Palindrome(构造)

    Atcoder 题面传送门 洛谷题面传送门 又是道思维题,又是道把我搞自闭的题. 首先考虑对于固定的 \(a_1,a_2,\dots,a_n;b_1,b_2,\dots,b_m\) 怎样判定是否合法, ...

  7. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

  8. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

  9. A*G#C001

    AGC001 A BBQ Easy 贪心. https://agc001.contest.atcoder.jp/submissions/7856034 B Mysterious Light 很nb这个 ...

随机推荐

  1. Meta 数据中文显示

      class Meta:verbose_name='待办事项'verbose_name_plural = verbose_name这是什么意思? verbose_name指定在admin管理界面中显 ...

  2. outlook 设置分类收邮件

    打开outlook,工具---->“规则和通知”.建相应的规则即可.

  3. Python基础(11)_python模块之time模块、rando模块、hashlib、os模块

    一.模块 1.什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀 模块的本质:模块的本质是一个py文件 2.模块分为三类:1)内置模块:2)第三方模块: ...

  4. Python3 进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  5. iOS 快速遍历 效率分析 for loop for in enumerateBlock 适用条件

    test1 简单遍历 结论: 当数组数据量很小 时候 for loop 和 for in 效率不相上下,随着数据量增长for in 快速枚举的优势 明显 如果需要知道 索引可用 enumrateBlo ...

  6. 建议40:深入掌握ConfigParser

    # -*- coding:utf-8 -*- ''' 1.getboolean() 根据一定的规则将配置项的值转换为布尔值 getboolean() 的真值规则: 0.no.false 和off 都会 ...

  7. android 7.0 (nougat)的编译优化-ninja

    http://blog.csdn.net/songjam/article/details/52640501 版权声明:本文为博主原创文章,未经博主允许不得转载. 从官方的定义,ninja大大缩短了an ...

  8. 键盘keyCode

    字母和数字键的键码值(keyCode)   按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 ...

  9. Eclipse常用插件安装_PropertiesEditor

    properties文件在项目中多用做i18n国际化支持的配置文件,在properties文件中出现的中文信息都要转换为Unicode文本,一般的做法都是使用JDK自带的native2ascii工具进 ...

  10. 多版本python的使用

    装任一版本的virtualenv都可以 在创建virtualenv时只需指定python的安装位置就可使用该版本的python virtualenv --python=D:\install\pytho ...