【CF549G】Happy Line

首先你直接模拟复杂度上天,不能通过此题。

由于有解时最后单调不降,那么我们考虑排序。

排什么?找不变量。

假设当前 \(a_i,a_{i+1}\) 需要进行操作。

那么结果变成 \(a_{i+1}+1,a_i-1\)

\(a_{i+1}\)\(pos_1=i+1\),值 \(val_1\)\(a_{i+1}\) ,更改后 \(pos_2=i\)\(val_2\)\(a_{i+1}+1\)

不难发现 \(val_1+pos_1=val_2+pos_2\)

不难推出,对于任意 \(a_i\)\(val+pos\) 是定值。

我们将 \(a_i+i\) 排序得到序列 \(b\),输出 \(b_i-i\)

不难发现无解情况是有 \(b_i=b_{i+1}\mid 1\le i<n\)

#include <stdio.h>
#include <algorithm>
int n,i;
int a[200005];
int main()
{
	scanf("%d",&n);
	for(i=1;i<=n;++i)
	{
		scanf("%d",a+i);
		a[i]+=i;
	}
	std::sort(a+1,a+n+1);
	for(i=1;i<n;++i)
	{
		if(a[i]==a[i+1])
		{
			puts(":(");
			return 0;
		}
	}
	for(i=1;i<=n;++i)
	{
		printf("%d ",a[i]-=i);
	}
	return 0;
}

posted @ 2023-02-05 09:33  Syara  阅读(4)  评论(0编辑  收藏  举报