传送门
题意:
一行数字可以前后交换,交换后,之前在前面的数字+1,之前在后面的数字-1,问是否可以将这一行数字通过交换使得得到一行单调上升的数字
题解:
可以发现交换前后数字都只改变1
不妨将数字的下标考虑进来,先不考虑1,直接交换
,可以发现我们交换后再减去下标就是上面的式子
所以原来的1就可以等价为直接交换
考虑到这样一个事实我们先给再排序后由于整体单增再减,也是单增的,即可以贪心
代码:
#include"iostream"
#include"algorithm"
#include"stdio.h"
using namespace std;
int a[200005];
int main()
{
// freopen("text.in","r",stdin);
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]+=i;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)a[i]-=i;
for(int i=2;i<=n;i++)if(a[i]<a[i-1]){printf(":(");return 0;}
for(int i=1;i<=n;i++)printf("%d ",a[i]);
return 0;
}