题意:
给你一个序列 ,让后可以进行改动 改动为 前者减一后者加一, 然后前后交换,问是否可以改变为非递减序列
题解:
改动规则很简单, 要后移 则权值加一,前进则权值减一,可以发现无论如何移动 每个点的权值加上下标都是不变的。
所以进行一下处理,排序,如果有权值加上下标相等的,则无法改变为非递减序列
代码:、
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
map<int, int> mark;
int main()
{
int n, a, value[200005];
while(scanf("%d", &n) != EOF)
{
mark.clear();
int flag = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &a);
value[i] = a + i;
if(mark[a+i]) flag = 1;
mark[a+i] = 1;
}
if(flag) printf(":(");
else
{
sort(value, value + n);
printf("%d", value[0]);
for(int i = 1; i < n; i++)
printf(" %d", value[i] - i);
}
printf("\n");
}
}