Portal -->agc001D

Description

  给你一个\(m\)个数的排列\(A\),这个\(A\)中元素的顺序可以随便调换,\(A\)中的元素的和为\(n\),现在要你构造一个数组\(B\)(长度为\(m1\)),满足:如果一个字符串同时满足:

1、头\(A_1\)个字符,接下来的\(A_2\)个字符,接下来的\(A_3\)个字符...接下来的\(A_m\)个字符分别构成回文串

2、头\(B_1\)个字符,接下来的\(B_2\)个字符,接下来的\(B_3\)个字符...接下来的\(B_{m1}\)个字符分别构成回文串

  那么这个字符串中每一个位置上的字符都一样

  

Solution

  日常不会构造题。。。qwq

  

  有一个比较好的想法就是。。画蚊香。。大概是这样:

​  这个图对应的是\(A=\{3,2\}\)\(B=\{4,1\}\)

​  然后我们要做的就是。。使得连完线之后可以一笔画

​  然后发现如果说出现一个长度为奇数的回文串,最中间的那个点就会没有线连,然后为了让它和其他的点连上,这个点的度数必须是\(1\),然后为了保证一笔画,这样的点必须至多出现两个,所以奇数长度的回文串至多只能有两个,否则就无解了,然后多画几组会发现。。如果出现奇数长度的回文串它们还必须出现在一头一尾qwq

​  那么剩下的就是构造啦

  当全部都是偶数的时候,我们在最开头先放一个\(1\),这样后面就错开了,然后第\(1\)到\(m-1\)都可以直接复制下来,至于最后一个回文串,我们可以放一堆\(2\)中间夹一个\(1\)这样(具体自己画一下就知道了)

  当有一个奇数的时候,我们把它放在\(A\)的最后,\(B\)的前面部分的构造方式同上,最后一个长度为奇数的回文串就简单一些,直接全部上\(2\)就好了

  当有两个奇数的时候,我们将其放在一头一尾,然后\(B\)的第一个元素设成\(A_1+1\),这样后面的情况就和只有一个奇数、并且已经放了一个\(1\)的情况一样了,剩下的构造同上

  

  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+10;
int a[N],b[N*2],lis[3];
int n,m,cnt;
bool firstcheck(){
int cnt=0;
for (int i=1;i<=n;++i)
cnt+=a[i]&1;
return cnt<=2;
}
void get_b(){
int sum;
if (cnt==0){
b[++b[0]]=1; sum=m-1;
for (int i=1;i<n;++i) b[++b[0]]=a[i],sum-=a[i];
if (sum==0) return;
sum-=1; sum/=2;
for (int i=1;i<=sum/2;++i) b[++b[0]]=2;
b[++b[0]]=1;
for (int i=sum/2+1;i<=sum;++i) b[++b[0]]=2;
}
else if (cnt==1){
b[++b[0]]=1;
for (int i=1;i<n;++i) b[++b[0]]=a[i];
for (int i=1;i<=(a[n]-1)/2;++i) b[++b[0]]=2;
}
else{
b[++b[0]]=a[1]+1;
for (int i=2;i<n;++i) b[++b[0]]=a[i];
for (int i=1;i<=(a[n]-1)/2;++i) b[++b[0]]=2;
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d%d",&m,&n);
for (int i=1;i<=n;++i) scanf("%d",a+i);
if (!firstcheck()){printf("Impossible\n"); return 0;}
cnt=0;
for (int i=1;i<=n;++i){
if ((a[i]&1))
lis[++cnt]=i;
}
if (lis[1]) swap(a[n],a[lis[1]]);
if (lis[2]) swap(a[1],a[lis[2]]);
for (int i=1;i<=n;++i) printf("%d ",a[i]); printf("\n"); get_b();
printf("%d\n",b[0]);
for (int i=1;i<=b[0];++i) printf("%d ",b[i]); printf("\n");
}

【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. 【LeetCode】9、Palindrome Number(回文数)

    题目等级:Easy 题目描述: Determine whether an integer is a palindrome. An integer is a palindrome when it rea ...

  3. 【LeetCode】680. Valid Palindrome II

    Difficulty:easy  More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/valid-palindrome ...

  4. 【HDOJ6599】I Love Palindrome String(PAM,manacher)

    题意:给出一个由小写字母组成的长为n的字符串S,定义他的子串[L,R]为周驿东串当且仅当[L,R]为回文串且[L,(L+R)/2]为回文串 求i=[1,n] 所有长度为i的周驿东串的个数 n<= ...

  5. 【原】Arrays.binarySearch() 的用法

    Arrays.binarySearch() 的用法 1.binarySearch(Object[] a, Object key) Searches the specified array for th ...

  6. 【LeetCode】125. Valid Palindrome

    题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...

  7. 【easy】479. Largest Palindrome Product

    Find the largest palindrome made from the product of two n-digit numbers Since the result could be v ...

  8. 【leetcode】409. Longest Palindrome

    problem 409. Longest Palindrome solution1: class Solution { public: int longestPalindrome(string s) ...

  9. 【LeetCode】214. Shortest Palindrome

    Shortest Palindrome Given a string S, you are allowed to convert it to a palindrome by adding charac ...

随机推荐

  1. Inception——Going deeper with convolutions

    1. 摘要 作者提出了一个代号为 Inception 的卷积神经网络架构,这也是作者在 2014 年 ImageNet 大规模视觉识别挑战赛中用于分类和检测的新技术. 通过精心的设计,该架构提高了网络 ...

  2. java中重要的多线程工具类

    前言 之前学多线程的时候没有学习线程的同步工具类(辅助类).ps:当时觉得暂时用不上,认为是挺高深的知识点就没去管了.. 在前几天,朋友发了一篇比较好的Semaphore文章过来,然后在浏览博客的时候 ...

  3. java分布式事务,及解决方案

    1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成 ...

  4. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  5. Linux下查看cpu使用率

    top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况,类似于Windows的任务管理 器.下面详细介绍它的使用方法. top - 02:53:32 up 16 ...

  6. linux下创建virtualenv时指定python版本

    virtualenv是python开发中一个重要的工具,它可以帮助我们创建一个干净的python解释环境,创建虚拟环境时,这个虚拟环境的python版本往往是系统默认的2.x版本.别急,我们只需要一条 ...

  7. Beta Scrum Day 2 — 听说

    听说

  8. “吃神么,买神么”的第二个Sprint计划

    “吃神么,买神么”的第二个Sprint计划   一.现状   前台布局设计完成一个主页,可以让浏览者了解我们网站的功能,这是第一个阶段的Spring完成的事情.由于没有实际的功能体现,所以第二阶段开始 ...

  9. (小组)第六次作业:NABCD模型分析。产品Backlog。

    NABCD模型分析: NABCD模型分析 1.N——need需求 随着时代的进步,人们生活水平的提高,现在手机的普及率已经非常高了,而且现在的家长很多时候会忙于工作,很少会花时间出来给自己读小学的孩子 ...

  10. 【我的python之路】

    目录 我的python之路[第一章]字符编码集,数据类型 我的python之路[第二章]循环-内置方法-数据类型 我的python之路[第三章]函数 我的python之路[第四章]装饰器.生成器.迭代 ...