题意

对于一对数组\(a_i\)和\(b_i\),满足\(\sum\limits_{i=1}^{k_a}a_i=\sum\limits_{i=1}^{k_b}b_i=N\),而且对于所有长度为\(N\)的字符串,如果在满足下列两个条件的前提下:

  • 对于前\(a_1\)个,接下来\(a_2\)个,再接下去\(a_3\)个……都是回文串

  • 对于前\(b_1\)个,接下来\(b_2\)个,再接下去\(b_3\)个……都是回文串

同时还必然满足这个字符串一定全部字符都一样。如果只有原来\(a_i\)的一个排列,求一种这个\(a_i\)数组和相应的\(b_i\)数组。注意可能不存在。

  • \(N\leq 10^5\)
  • \(k_a \leq 100\)
  • \(A_i\leq 10^5\)

分析

先考虑\(k_a\)比较小的情况,例如\(k_a=1\),这个时候可以发现我们只需要让回文串错一位就可以了。

对于\(k_a=2\),考虑我们从那个中间分隔的点开始往外直接扩展,实际上只要覆盖到两边回文串中间的那个点,然后剩下来的直接随便覆盖就可以了(因为就这一些已经将两个回文串“连接”在了一起),这是一个思路,但是比较难以实现。

更加直接的思路(按照题解),还是按照错位,我们考虑实际上只需要将中间那个分割点向左边移动一下,那也是能够相应建立关系的。

按照这个思路,我们应该可以进一步地考虑推广!我们应该可以按照这个思路,只需要取\(b=\{a_1-1,a_2,\cdots,a_{k_a-1},a_{k_a}+1\}\),这种答案的构造方法,除非是中间的数是偶数,否则都是可以的。

那么当存在大量偶数的时候有没有可能构造出一个相应的解呢?我们考虑设\(a\)里面偶数有\(O_a\)个,\(b\)里面偶数有\(O_b\)个,那么边数是\(\frac{N-O_a}{2}+\frac{N-O_b}{2}\),考虑如果我们要让这\(N\)个点连通,我们肯定至少需要\(N-1\)条边,那么也就是\(\frac{N-O_a}{2}+\frac{N-O_b}{2}\geq N-1\),这个不等式算出来是\(O_a+O_b\leq 2\)……于是我们发现不可能偶数多于\(2\)个。如果满足的话那一定可以将这两个偶数调到最前和最后。

那么我们只要扫一遍就可以得到了。回顾一下思路,我们从\(k_a=1\)的情况推出了错位的思路,然后进一步推广到了一般情况,同时对于一种看上去比较特殊的情况得出了解。最后,我们证明了剩下的情况没有解,实际上也就是说因为有偶数,所以相当于要浪费一部分边去专门将偶数导走,然后整个图就无法导通。

注意在写的时候有可能会出现减出\(0\)的情况,所以需要再判一下边界情况。

# include <bits/stdc++.h>
# define il inline
# define fi first
# define se second
# define pb push_back
# define mem(x,v) memset(x,v,sizeof x)
# define rep(i,x,y) for(int i=x;i<=y;++i)
# define re(i,x,y) for (int i=x;i<y;++i)
using namespace std;
typedef long long ll;
il ll read(){ll x=0; char c=getchar();for(;c<'0'||c>'9';c=getchar());for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x;
}
const int maxm = 100+10;
int n,m;
int a[maxm];
vector<int> b;
int main(){n=read(); m=read();rep(i,1,m) a[i]=read();if (m == 1){b.pb(1); b.pb(n-1);}else{int cnt = 0;rep(i,1,m) cnt += a[i] % 2;if (cnt > 2){puts("Impossible"); return 0;}rep(i,2,m-1)if (a[i]%2==1){if (a[1]%2==0)swap(a[1],a[i]);else swap(a[m],a[i]);}b.pb(a[m]+1);for (int i=m-1;i>1;--i) b.pb(a[i]);b.pb(a[1]-1);}rep(i,1,m) printf("%d ",a[i]); printf("\n");int bs=b.size();if (b[bs-1] == 0)--bs;printf("%d\n",bs);for (int i=bs-1;i>=0;--i) printf("%d ",b[i]); printf("\n");return 0;
}

转载于:https://www.cnblogs.com/wendavid/p/8982266.html

[AGC001 D]Arrays and Palindrome相关推荐

  1. AtCoder AGC001D Arrays and Palindrome (构造)

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

  2. AGC001 补题小结

    Problem A BBQ Easy 简要题意:给定 \(2n\) 个数字,两两配对,一对的贡献为它们的 \(min\) ,求最大贡献和.\(n\le 100\) tag:小学生贪心 题解:排个序,求 ...

  3. 267. Palindrome Permutation II --back tracking 以及palindrome 的优化方法ing

    产生input中 所有permutation 中符合 palindrome 的. Input: "aabb" Output: ["abba", "ba ...

  4. 蓝桥杯部分题型(奇怪的比赛,电话号码,palindrome)

    关与作者更多博客请访问云里云外开源社区 文章目录 2. 奇怪的比赛 3. palindrome 先来一段自己的翻译 4. 电话号码(其他来源,请参考) 未完待续! 2. 奇怪的比赛 某电视台举办了低碳 ...

  5. 【LeetCode】Palindrome Partitioning 解题报告

    [题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...

  6. Numpy掩码数组masked arrays,这一篇就够了

    Numpy掩码数组masked arrays,这一篇就够了 1. 什么是掩码数组 2.示例 2.1 一个例子走进掩码数组 2.2 创建一个数组第二个值是无效的 2.3 创建一个数组所有靠近1.e20的 ...

  7. 234. Palindrome Linked List - Easy

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  8. JavaSE基础:Arrays工具类

    Java工具类: Arrays Arrays类是数组的操作类,定义在java.util包中,主要功能是实现数组元素的查找/数组内容的充填/排序等功能 1.排序数组的sort方法 重点:对数组元素进行排 ...

  9. LeetCode 125 Valid Palindrome(有效回文)(*)

    版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/5062 ...

最新文章

  1. 警惕!国内某广告SDK内置“后门”功能,Google Play商店已强制下架
  2. 停课集训 11.29
  3. left join 不重复_R语言ETL工程:连接(join)
  4. 程序员到底该怎么给女朋友挑礼物
  5. [kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana HDU - 1069
  6. JavaScript异步编程之事件
  7. centos搭建git服务
  8. 黎明杀机手游未能连接服务器,黎明杀机无法连接在线服务及EAC绿条读完后无反应解决方法...
  9. phpstorm 的下载、安装与激活
  10. mysql安装开始报错_MYSQL安装报错 -- 出现Failed to find valid data directory.
  11. java方法的理解、调用栈与异常处理
  12. 【JavaScript 封装库】BETA 2.0 测试版发布!
  13. 《经济学人》15个栏目版块介绍,快速了解杂志!
  14. postgresql客户端代码上传中文数据到服务器
  15. 嵌入式Linux开发工具(vim的使用)
  16. 一文了解超级账本DLT、库、开发工具有哪些, Hyperledger家族成员你认识几个?
  17. java shiro_shiro(java安全框架)
  18. 机械制造作业考研题目答案分享——回转体的加工
  19. Intel寄存器名称解释及用途,%eax%ebx等都是什么意思
  20. OFDM系统中为什么子载波间隔△f是符号周期Ts的倒数

热门文章

  1. 更改c语言程序保存地址吗,C语言文本文件实现局部修改
  2. android中获取mac地址8.0,关于Android8.0以下手机获取蓝牙Mac地址的问题和扫描周围的手机蓝牙问题 下篇...
  3. matlab腔内光子寿命,mcFORnp matlab环境下,利用蒙特卡洛模拟光子包在生物组织内的光路传输 271万源代码下载- www.pudn.com...
  4. 复用 TensorFlow 模型
  5. AJAX框架衣柜内部结构,揭秘最实用的衣柜内部结构这样布局,速速get!
  6. python开发网站的优势_Python开发 的优势在哪里
  7. 去雾综述_【综述】图像去雾的前世今生
  8. 租借云服务器 工业信号数据采集,一种工业用物联网云服务平台智能采集方法...
  9. c语言获取当前日期和时间
  10. 利用urllib3 抓取博客列表