Mister B and PR Shifts(思维)
Describe
Some time ago Mister B detected a strange signal from the space, which he started to study.
After some transformation the signal turned out to be a permutation p of length n or its cyclic shift. For the further investigation Mister B need some basis, that's why he decided to choose cyclic shift of this permutation which has the minimum possible deviation.
Let's define the deviation of a permutation p as .
Find a cyclic shift of permutation p with minimum possible deviation. If there are multiple solutions, print any of them.
Let's denote id k (0 ≤ k < n) of a cyclic shift of permutation p as the number of right shifts needed to reach this shift, for example:
- k = 0: shift p 1, p 2, ... p n,
- k = 1: shift p n, p 1, ... p n - 1,
- ...,
- k = n - 1: shift p 2, p 3, ... p n, p 1.
Input
First line contains single integer n (2 ≤ n ≤ 106) — the length of the permutation.
The second line contains n space-separated integers p 1, p 2, ..., p n (1 ≤ p i ≤ n) — the elements of the permutation. It is guaranteed that all elements are distinct.
Output
Print two integers: the minimum deviation of cyclic shifts of permutation p and the id of such shift. If there are multiple solutions, print any of them.
Examples
Input
3
1 2 3
Output
0 0
Input
3
2 3 1
Output
0 1
Input
3
3 2 1
Output
2 1
Note
In the first sample test the given permutation p is the identity permutation, that's why its deviation equals to 0, the shift id equals to 0 as well.
In the second sample test the deviation of p equals to 4, the deviation of the 1-st cyclic shift (1, 2, 3) equals to 0, the deviation of the 2-nd cyclic shift (3, 1, 2) equals to 4, the optimal is the 1-st cyclic shift.
In the third sample test the deviation of p equals to 4, the deviation of the 1-st cyclic shift (1, 3, 2) equals to 2, the deviation of the 2-nd cyclic shift (2, 1, 3) also equals to 2, so the optimal are both 1-st and 2-nd cyclic shifts.
Solution
数据范围1e6暴力绝对T,所以我我们要找一下规律以简化总偏移量的求和.
我们知道k是将数组后面k位,移到前面来,所以我们可以每次将末尾1位提到前面,每次的偏移量之和承接上一个来求,复杂度O(n)
假设末尾数不提前,只是整体向右移,则一个数右移后与大于坐标的对于总和之差贡献是-1,反之则贡献是1(这两种数的个数每次循环都会改变)
对于提到前面的数特判一下不要乱...
Code
数字后加LL表示强转long long
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll p[maxn],h[maxn<<1];//h[i]表示大于初始坐标i的数的个数
ll n,d,x,eq,ans,k;//d是每次右移前大于坐标的数的个数,x是小于的,eq是等于的
int main(){
scanf("%lld",&n);
for(ll i=1LL;i<=n;++i){
scanf("%lld",&p[i]);
if(p[i]>i)d++,h[p[i]-i]++;
else if(p[i]==i)eq++,h[0]++;
else x++;
ans+=abs(p[i]-i);
}
ll tmp=ans;
for(ll last=n-1LL,now=1LL;last>=1LL;last--,now++){
tmp+=(eq+x);tmp-=d;
d-=h[now];//常规处理完毕,下面开始特判
if(p[last+1]>=last+1)h[p[last+1]-(last+1)]--;
h[p[last+1]-1+now]++;
eq=h[now];
if(p[last+1]>1LL)d++;
x=n-eq-d;
tmp-=abs(p[last+1]-n-1LL);
tmp+=abs(p[last+1]-1LL);
if(tmp<ans)ans=tmp,k=now;
}
printf("%lld %lld
",ans,k);
return 0;
}