补一下原来做过的AtCoder思维题的题解

题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_d

先特判一些小的情况。

原题就相当于每个回文串对称的位置连边,要求图联通。一个长度为\(k\)的回文串,会连\([\frac{k}{2}]\)(中括号下取整)条边。假设所有回文串(包括\(a\)和\(b\))的长度为\(l_i\), 则\(\sum l_i=2n, \sum[\frac{l_i}{2}]\ge 2n-1\), 可得\(\sum (l_i\mod 2)\le 2\), 奇数长度的回文串不超过\(2\)个。

考虑一种连边方式: 比如\([1,9]\)是回文串,\([1,8]\)是回文串,那么\(a_9=a_1=a_8=a_2=a_7=a_3=a_6=a_4=a_5\), 很容易得到\(a_1\)至\(a_9\)全相等。假设我们再令\([10,17]\)是回文串,\([9,16]\)是回文串,那么\(a_9=a_{16}=a_{11}=a_{14}=a_{13}=a_{12}=a_{15}=a_{10}=a_{17}\), 则\(a_1\)至\(a_{17}\)全相等。但是如果我们令\([10,18]\)和\([9,17]\),而不是\([10,17]\)和\([9,16]\), 那么将得到\(a_9=a_{17}=a_{11}=a_{15}=a_{13}\), 再无法连通。意思就是如果奇数的放到开头或者结尾没有问题,但是如果放到中间会有问题。那么既然奇数长度的回文串不超过\(2\)个那么把它们换到开头结尾即可。

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 2e5;
int a[N+3];
int n,m; int main()
{
scanf("%d%d",&n,&m); int cnt = 0;
for(int i=1; i<=m; i++) {scanf("%d",&a[i]); cnt += (a[i]&1);}
if(m==1)
{
if(a[1]==1) printf("1\n1\n1\n");
else printf("%d\n2\n%d %d\n",a[1],1,a[1]-1);
return 0;
}
else if(m==2)
{
if(a[1]==1 && a[2]==1) {printf("1 1\n1\n2\n");}
else if(a[1]==1) {printf("1 %d\n1\n%d\n",a[2],n);}
else {printf("%d %d\n2\n%d %d\n",a[1],a[2],a[1]-1,a[2]+1);}
return 0;
}
if(cnt>2) {printf("Impossible"); return 0;}
if(cnt==1)
{
for(int i=1; i<=m; i++) if(a[i]&1) {swap(a[i],a[1]); break;}
}
else
{
int flag = 0;
for(int i=1; i<=m; i++) if(a[i]&1) {flag++; if(flag==1) swap(a[i],a[1]); else {swap(a[i],a[m]); break;}}
}
for(int i=1; i<=m; i++) printf("%d ",a[i]); puts("");
printf("%d\n",a[1]==1 ? m-1 : m);
if(a[1]>1) printf("%d ",a[1]-1);
for(int i=2; i<=m; i++) printf("%d ",a[i]+(i==m?1:0)); puts("");
return 0;
}

AtCoder AGC001D 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(构造)

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

  3. 【agc001d】Arrays and Palindrome

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

  4. AtCoder Grand Contest 001 D - Arrays and Palindrome

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

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

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

  6. Atcoder C - +/- Rectangle(思维+构造)

    题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_c 题解:挺简单的构造,很容易想到的构造方法就是(h*w)的小矩阵里其他值赋值为1,最后一个赋值为 ...

  7. Codeforces 1090D - Similar Arrays - [思维题][构造题][2018-2019 Russia Open High School Programming Contest Problem D]

    题目链接:https://codeforces.com/contest/1090/problem/D Vasya had an array of n integers, each element of ...

  8. Agc001_D Arrays and Palindrome

    传送门 题目大意 给定一个元素和为$N$的有$M$个数的序列$A$,请你可以$A$元素排列的顺序,并需要构造一个有$K$个($K$可以自己定)数的数列,使得任意一个长度为$N$的字符串,若满足:前$A ...

  9. AtCoder Grand Contest

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

随机推荐

  1. IntelliJ IDEA热部署插件JRebel免费激活图文教程(持续更新)转载

    之前教了大家如何免费激活IDEA,大家学会了吗?今天再来教大家如何免费激活JRebel插件,实现真正的热部署,无论是改了代码片段还是配置文件,都可以做到不用重新启动就生效,这种酸爽,谁用谁知道! 这次 ...

  2. SqlServer2008 R2发布订阅

    网上好多大神写的贴子,自己也看着贴子弄的,写的已经很详细了,我就不重复写了,贴上参考资料: http://www.cnblogs.com/dudu/archive/2010/08/26/1808540 ...

  3. ADO与达梦7产生的一个未知问题

    采用OLEDB与达梦7建立数据库连接 连接成功 查询表成功 打开表成功 当进行到addnew 操作时  报异常,未知错误 而且是仅针对这张表 ,其他表都没有问题 当清空数据后可以再插入一次数据,之后就 ...

  4. Ubuntu16.04 + caffe + cuda 环境搭建

    1. sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-de ...

  5. vue-cli3 本地数据模拟后台接口

    vue-cli3 本地数据模拟后台接口 原理: 将本地的json数据在前端模拟为后台接口,然后调用接口,完成前端操作.在后台接通后可以直接在api配置文件中修改路径,完成前后台对接. 配置: 1.文件 ...

  6. 解决 VS Code「Code Runner」插件运行 python 时的中文乱码问题

    描述 这里整理了两种 VS Code「Code Runner」插件运行 python 时乱码的解决方案.至于设置「Auto Guess Encoding」为 true 的操作这里就不多描述了. 乱码截 ...

  7. Stanford NLP 课程笔记之计算字符串距离

    在自然语言处理任务中,有时候需要计算两个字符串之间的相似度,也可以称作是两者之间的距离,用最小编辑距离表示. 最小编辑距离用{Insertion,Deletion,Substitution}这三种操作 ...

  8. docker 无法使用vi

    更新来源 apt-get update   安装vim apt-get install -y vim

  9. jstl的forEach 循环

    jstl的forEach循环一般有两种格式 1.当需要操作循环的下标时,或者需要固定循环的次数时: <c:forEach begin="0" end="5" ...

  10. Linux 虚拟机扩容

    由于在装软件,原来的20G空间不够使用,需要扩容操作. 1.关闭虚拟机 2.点击编辑虚拟机设置 选中硬盘,添加,硬盘,推荐,确定大小,完成. 2.启动虚拟机 查看磁盘使用情况: [root@maste ...