【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;
}