P10369 题解

跟官方有点不太一样的解法,可能会有些麻烦。

注意到最终剩下的数一定 2\le2,所以构造的方案一定要使得最后剩下的数为 22

证明

设两个数 a,ba,ba,b0a,b\ge0)。

a0,b0a\not=0,b\not=0 时,mex(a,b)=0<2\operatorname{mex}(a,b)=0\lt2

a=0,b=1a=0,b=1a=1,b=0a=1,b=0 时,mex(a,b)=2\operatorname{mex}(a,b)=2

否则,mex(a,b)=1<2\operatorname{mex}(a,b)=1\lt2

综上 mex(a,b)2\operatorname{mex}(a,b)\le2

定义对长度为 ll 的自然数序列 a1,a2ala_1,a_2\dots a_l 的一次分解操作,是将序列 aa 替换为长度为 l+1l+1 的序列 b1,b2bl+1b_1,b_2\dots b_{l+1},其中 ai=mex(bi,bi+1)a_i = \operatorname{mex}(b_i, b_{i+1})1il1\le i\le l)。

最终的构造方案就是对 22 进行 n1n-1 次分解操作,最终得到的序列,答案肯定是不唯一的。

注意到长度为 nn 的答案是可以由长度为 n1n-1 的答案分解得到。

尝试着分解,发现:

n=2n=2 时,构造序列可以为 [1,0][1,0]

n=3n=3 时,由 n=2n=2 分解得到 [0,2,2][0,2,2]

n=4n=4 时,由 n=3n=3 分解得到 [1,1,0,1][1,1,0,1]

n=5n=5 时,由 n=4n=4 分解得到 [2,0,2,2,0][2,0,2,2,0]

n=6n=6 时,由 n=5n=5 分解得到 [0,1,1,0,1,1][0,1,1,0,1,1]

n=7n=7 时,由 n=6n=6 分解得到 [2,2,0,2,2,0,2][2,2,0,2,2,0,2]

以此类推,可以得到:

2
1 0
0 2 2
1 1 0 1
2 0 2 2 0
0 1 1 0 1 1
2 2 0 2 2 0 2
1 0 1 1 0 1 1 0
0 2 2 0 2 2 0 2 2
1 1 0 1 1 0 1 1 0 1
2 0 2 2 0 2 2 0 2 2 0
0 1 1 0 1 1 0 1 1 0 1 1
...

其中第 ii 行表示当 nn 等于 ii 是 的答案。

把奇数行和偶数行分开来看。

2
0 2 2
2 0 2 2 0
2 2 0 2 2 0 2
0 2 2 0 2 2 0 2 2
2 0 2 2 0 2 2 0 2 2 0

1 0
1 1 0 1
0 1 1 0 1 1
1 0 1 1 0 1 1 0
1 1 0 1 1 0 1 1 0 1
0 1 1 0 1 1 0 1 1 0 1 1

发现第 ii 行(i>2i\gt2)的答案就是在第 i2i-2 行的答案头和尾各添加一个数。而第 22 行的序列为 [1,0][1,0]

发现奇数行添加的数为:

0 2
2 0
2 2
0 2
...

偶数行添加的数为:

1 1
0 1
1 0
1 1
...

由此就可以 O(n)O(n) 构造了,具体实现见代码。

代码

#include<bits/stdc++.h>
using namespace std;
int t,n;
deque<int>q; //双端队列维护头和尾的添加
void Push(int x,int y){q.push_front(x),q.push_back(y);} //添加操作
int main(){
	scanf("%d",&t);
	while(t--){
	    scanf("%d",&n);
		while(!q.empty()) q.pop_back();
		if(n&1){ //奇数行
			q.push_back(2);
			int s=n/2;
			for(int i=1;i<=s;i++){
				if(i%3==1) Push(0,2);
				else if(i%3==2) Push(2,0);
				else Push(2,2);
			}
		}
		else{ //偶数行
			Push(1,0);
			int s=n/2-1;
			for(int i=1;i<=s;i++){
				if(i%3==1) Push(1,1);
				else if(i%3==2) Push(0,1);
				else Push(1,0);
			}
		}
		while(!q.empty()){printf("%d ",q.front()),q.pop_front();}
		putchar('\n');
	}
	return 0;
}
posted @ 2024-04-21 11:39  fengxiaoyi  阅读(10)  评论(0)    收藏  举报  来源