CF1862B Sequence Game

发布时间 2023-08-25 14:58:17作者: One_JuRuo

思路

题目要求 \(m \le 2\times n\),而 \(a_i\) 被取出来,只需要 \(a_{i-1}\le a_i\) 即可,\(a_i\) 被取,只关系于 \(a_{i-1}\) 的大小。

因为第一个数是必取的,所以我们可以每两个数之间加一个数,以满足除了 \(b_1\) 以外的其他 \(b_i\) 会被取。

加的数可以都是 \(1\),但是赛时没想到,我的做法是 \(b_i\)\(b_{i+1}\) 之间加一个 \(min(b_i-1,b_{i+1})\)。这样可以保证加入的数一定小于 \(b_i\),且一定小于等于 \(b_{i+1}\),这样就一定取不到新加的数,一定取得到 \(b_{i+1}\)

但是有个特殊情况,就是 \(b_i=1\) 的情况,因为序列 \(a\) 不存在 \(0\)\(b_{i+1}\) 也一定大于等于 \(1\)吗,所以这种情况本身就满足条件,不需要新加数。

当然了,因为本蒟蒻太笨了,赛时没想到只需要把所有满足 \(b_i >b_{i+1}\)\(b_i\)\(b_{i+1}\) 之间加一个 \(1\) 就好。但是,至少能过。

AC code

#include<bits/stdc++.h>
using namespace std;
int T,n,a[200005],b[400005],cnt;
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n),cnt=0;
		for(int i=1;i<=n;++i) scanf("%d",&a[i]);
		for(int i=1;i<=n;++i)
		{
			b[++cnt]=a[i];
			if(i<n&&a[i]>1) b[++cnt]=min(a[i]-1,a[i+1]);
		}
		printf("%d\n",cnt);
		for(int i=1;i<=cnt;++i) printf("%d ",b[i]);
		puts("");
	}
}