Atcoder Grand Contest 001 D - Arrays and Palindrome(构造)
又是道思维题,又是道把我搞自闭的题。
首先考虑对于固定的 \(a_1,a_2,\dots,a_n;b_1,b_2,\dots,b_m\) 怎样判定是否合法,我们对于回文串对应的点之间连边,表示它们必须相等,这样可以形成一张图,如果该图连通那么证明这两个数组合法,反之不合法,正确性显然。
注意到对于每个 \(a_i\) 会连出 \(\lfloor\dfrac{a_i}{2}\rfloor\) 条边,换句话说,如果 \(a_i\) 是偶数那么全部 \(\dfrac{a_i}{2}\) 条边都能连,如果 \(a_i\) 是奇数那么会出现一个孤立点,综上 \(a\) 部分连出的边的个数为 \(\dfrac{n-a\ \text{数组中奇数的个数}}{2}\),而 \(b\) 数组不论你怎么排最多只能连出 \(\lfloor\dfrac{n}{2}\rfloor\) 条边,故如果 \(a\) 数组中奇数个数 \(\geq 3\),那么最多也只能连出 \(\dfrac{n-3}{2}+\dfrac{n-1}{2}=n-2<n-1\) 条边,无解。
接下来考虑怎样构造出符合要求的解,先从特殊的情况开始,如果 \(m=1\),那么分两种情况:\(n=1\) 那么显然 \(m=1,b_1=1\) 就符合要求。如果 \(n>1\),那么考虑一个“错位”的思想,分两组,一组长度为 \(1\),另一组长度为 \(n-1\),这样连就能解决问题了,因为这样会导致 \(1\) 与 \(n\) 相连,\(n\) 与 \(2\) 相连,\(2\) 又与 \(n-1\) 相连……\(i\) 与 \(n-i+1\) 和 \(n-i\) 相连,最终 \(1\sim n\) 就一定会被连成一条链了。
接下来考虑更一般的情况,考虑先重排 \(a\) 数组,如果 \(a\) 数组有奇数,就将奇数放在 \(a\) 数组的两边(有一个就放在开头,有两个就一个放开头一个放结尾)。其次考虑这样构造 \(b\) 数组,\(b_1=a_1+1,b_i=a_i(i\in [2,n]),b_n=a_n-1\)。这样做就对了。
为什么?其实也是用了“错位”的思想,借鉴 \(n=2\) 的经验,构造 \(b_1=a_1+1\) 显然可以使前 \(a_1\) 个数连成一片,同时也能将第一块(\([1,a_1]\))与第二块(\([a_1+1,a_1+a_2]\))串在一起,以此类推就能将全部 \(n\) 个数串在一起。还有一个问题,那就是为什么一定要把奇数放到开头或结尾,因为假设 \(\exist i,a_i=b_i\equiv 1\pmod{2}\),那么 \(a_i\) 与 \(b_i\) 在字符串上对应的位置一定是一个两个长度为 \(a_i\) 区间,并且左、右端点各相差 \(1\),不妨设其为 \([l,r]\) 与 \([l+1,r+1]\),考虑对棋盘进行黑白染色,\(l,l+2,l+4,\dots,l+2k,\dots\) 染黑色,\(l+1,l+3,l+5,\dots,l+2k+1,\dots\) 染白色,由 \(a_i\equiv 1\pmod{2}\) 可知 \(l\) 与 \(r\) 染色相同,故我们显然只在颜色相同的点之间连边,故黑格与白格间没有边,图也就不连通了。
所以怎么说呢?这种人类智慧思维题,我根本想不出来/kk,wtcl/wq
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define ffe(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
int n,m,p1,p2,cnt[2],a[105];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d",&a[i]),cnt[a[i]&1]++;
if(cnt[1]>=3){puts("Impossible");return 0;}
if(m==1){
if(a[1]==1) printf("1\n1\n1\n");
else printf("%d\n2\n1 %d\n",a[1],a[1]-1);
return 0;
} sort(a+1,a+m+1,[](int x,int y){return (x&1)>(y&1);});
printf("%d ",a[1]);for(int i=3;i<=m;i++) printf("%d ",a[i]);printf("%d\n",a[2]);
vector<int> ans;ans.pb(a[1]+1);for(int i=3;i<=m;i++) ans.pb(a[i]);if(a[2]!=1) ans.pb(a[2]-1);
printf("%d\n",ans.size());ffe(it,ans) printf("%d ",*it);printf("\n");
return 0;
}
Atcoder Grand Contest 001 D - Arrays and Palindrome(构造)的更多相关文章
- AtCoder Grand Contest 001 D - Arrays and Palindrome
题目传送门:https://agc001.contest.atcoder.jp/tasks/agc001_d 题目大意: 现要求你构造两个序列\(a,b\),满足: \(a\)序列中数字总和为\(N\ ...
- AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识
链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...
- Atcoder Grand Contest 001 F - Wide Swap(拓扑排序)
Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的 ...
- AtCoder Grand Contest 001
B - Mysterious Light 题意:从一个正三角形边上一点出发,遇到边和已走过的边则反弹,问最终路径长度 思路:GCD 数据爆long long #pragma comment(linke ...
- [Atcoder Grand Contest 001] Tutorial
Link: AGC001 传送门 A: …… #include <bits/stdc++.h> using namespace std; ; ]; int main() { scanf(& ...
- AtCoder Grand Contest 001 题解
传送门 \(A\) 咕咕咕 const int N=505; int a[N],n,res; int main(){ scanf("%d",&n); fp(i,1,n< ...
- JZOJ5405 & AtCoder Grand Contest 001 F. Permutation
题目大意 给出一个长度为\(n\)的排列\(P\)与一个正整数\(k\). 你需要进行如下操作任意次, 使得排列\(P\)的字典序尽量小. 对于两个满足\(|i-j|>=k\) 且\(|P_i- ...
- AtCoder Grand Contest 027 (AGC017) D - Modulo Matrix 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC027C.html 题解 首先我们假装 max mod min = 1 然后对着这个构造. 将各自黑白染色, ...
- AtCoder Grand Contest 030 (AGC030) C - Coloring Torus 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC030C.html 题解 才发现当时是被题意杀了. 当时理解的题意是“对于任意的 (i,j) ,颜色 i 和 ...
随机推荐
- JavaScript03
类型转换和运算符 typeof函数 检测数据类型,可以使用以下两种调用的方式: typeof 变量或表达式 typeof(变量或表达式) var n="asda"; console ...
- SpringCloud微服务实战——搭建企业级开发框架(七):自定义通用响应消息及统一异常处理
平时开发过程中,无可避免我们需要处理各类异常,所以这里我们在公共模块中自定义统一异常,Spring Boot 提供 @RestControllerAdvice 注解统一异常处理,我们在GitEgg ...
- UltraSoft - Beta - Scrum Meeting 7
Date: May 23rd, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 暂无 Liuzh 前端 编写忘记密码界面 Kkkk 前端 暂无 王fuji 前端 ...
- netty中使用protobuf实现多协议的消息
在我们使用 netty 的过程中,有时候为了高效的传输数据,经常使用 protobuf 进行数据的传输,netty默认情况下为我们实现的 protobuf 的编解码,但是默认的只能实现单个对象的编解码 ...
- CF375D Tree and Queries 题解
感觉CF的题目名都好朴素的样子 你谷链接 首先这题显然是个dsu on tree 但是我不会. 其次这题显然是个莫队.这我会啊! 然后会发现好像不是很对劲.因为每次询问都有一个k,貌似和传统的莫队数颜 ...
- 必备的60个常用的Linux命令
Linux必学的60个命令Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令. ...
- jdk8下载与安装教程
jdk8下载与安装教程下载有两种方式 一.网盘下载网盘下载链接 pan.baidu.com/s/1VQAwHS6WDjemDnKDnPIvww 提取码:f5tv二.官网下载如果想自己一步步研究亲自实 ...
- PDF转图片部分公式字符丢失问题解决的爬坑记录
现象 PDF教材导出到系统中,由程序将PDF转为图片后合并成一张大图供前端标注,但是在标注数学和化学学科的时候且源文件是PDF的情况下出现公式部分字符丢失的情况,如下图 原件 转换后效果 WTF! 转 ...
- linux 内核源代码情景分析——i386 的页式内存管理机制
可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...
- 虚拟机克隆后修改mac地址和ip地址
(1)虚拟机克隆在新的虚拟机下会有文件产生变化. /etc/udev/rules.d/70-persistent-net.rules 文件中会多一个eth1 网卡的文件 ,eth0 的那行文件是原虚 ...