zoukankan      html  css  js  c++  java
  • Mister B and PR Shifts(思维)

    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 img.

    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;
    }
    
  • 相关阅读:
    js Validate
    JS
    JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari……
    自动搜索 下拉单
    有符号数和无符号数间的比较.
    结构体指针在函数调用中的实例
    如何计算时间复杂度
    指针和引用的比较
    指针参数是如何传递内存的
    fread函数和fwrite函数,read,write
  • 原文地址:https://www.cnblogs.com/Lour688/p/12858743.html
Copyright © 2011-2022 走看看