分析

这道题\(n\leq10^{6}\),显然\(n^{2}\)的暴力是无法解决问题的

那么我们可以考虑数列的某一种性质

因为最终的答案是\(\sum{n \atop i=1} |p_i - i|\),和绝对值有关,所以我们把数列中的数分为两类

第一类是\(p_i-i>0\),第二类是\(p_i-i\leq0\)

我们可以开四个变量:\(Zcnt\) 记录第一类数的个数,\(Ztot\) 记录第一类数对结果的贡献,\(Fcnt\) 记录第二类数的个数,\(Ftot\) 记录第二类数对结果的贡献

这些变量的初始值我们可以预处理出来

每次我们把数列中位置最靠后的元素拿出来,放在最前面,其他的元素向后移动一位

我们先不考虑临界元素和特殊情况

一个很显然的结论是,除了扔到队首的那一个元素,第一类数每次做出的贡献之和都要减去\(Zcnt\),第二类数每次做出的贡献之和都要加上\(Fcnt\)

但是\(Zcnt\)和\(Fcnt\)的个数并不是恒定不变的,有两种特殊情况

1、一个数由第一类数变为第二类数,这时的临界条件是\(p_i-i=0\)

那么我们只需要在读入的时候预处理每一个数发生临界变化的时间就可以了

2、一个数由第二类数变为第一类数,这时只有可能是原来在队尾的数扔到了队首

这时我们只需要特判一下就可以了

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e7+5;
ll n,Zcnt,Fcnt,Ztot,Ftot;
ll a[maxn],judone[maxn];
int main(){
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(ll i=1;i<=n;i++){
if(a[i]<=i){
Fcnt++;
Ftot+=(i-a[i]);
} else {
judone[a[i]-i]++;
Zcnt++;
Ztot+=(a[i]-i);
}
}
ll ans=Ztot+Ftot,jl=0;
for(ll i=1;i<n;i++){
Ztot-=Zcnt;
Zcnt-=judone[i];
Ftot+=Fcnt;
Fcnt+=judone[i];
ll x=a[n-i+1];
Ftot-=n+1-x,--Fcnt;
if(x>1)++judone[x-1+i],Ztot+=x-1,++Zcnt;
else ++Fcnt;
if(ans>Ftot+Ztot) ans=Ftot+Ztot,jl=i;
}
printf("%lld %lld\n",ans,jl);
return 0;
}

CF819B Mister B and PR Shifts 思维题的更多相关文章

  1. CF819B Mister B and PR Shifts 题解

    题目 Some time ago Mister B detected a strange signal from the space, which he started to study. After ...

  2. codeforces 819B - Mister B and PR Shifts(思维)

    原题链接:http://codeforces.com/problemset/problem/819/B 题意:把一个数列整体往右移k位(大于n位置的数移动到数列前端,循环滚动),定义该数列的“偏差值” ...

  3. [CF819B]Mister B and PR Shifts

    题意:定义一个排列$p_{1\cdots n}$的“偏移量”$D=\sum _{i=1}^n\left|p_i-i\right|$ 求它所有的轮换排列中偏移量最小的是多少,要求输出轮换序数 暴力就是求 ...

  4. Codeforces Round #421 (Div. 2) D. Mister B and PR Shifts

    Codeforces Round #421 (Div. 2) D. Mister B and PR Shifts 题意:给一个长度为\(n\)的排列,每次可以向右循环移位一次,计算\(\sum_{i= ...

  5. codeforces 820 D. Mister B and PR Shifts(思维)

    题目链接:http://codeforces.com/contest/820/problem/D 题意:求.有一种操作 k = 0: shift p1, p2, ... pn, k = 1: shif ...

  6. D. Mister B and PR Shifts

    ;//开两倍空间 int n; arr p,cnt; int l,r,m; ll sum = ,ans; int main() { // file("test"); sdf(n); ...

  7. Codeforces Round #421 (Div. 2)D - Mister B and PR Shifts(模拟)

    传送门 题意 给出n个数,计算在进行n-1次右移中\(min\sum_{i=1}^nabs(p_i-i)\) 分析 我们设置cnt[p[i]-i]为一个数p[i]与它标准位置(如1的标准位置为1)的左 ...

  8. CF820D Mister B and PR Shifts

    题目链接:http://codeforces.com/problemset/problem/820/D 题目大意: 给出一个\(n\)元素数组\(p[]\),定义数组\(p[]\)的误差值为\(\su ...

  9. Mister B and PR Shifts,题解

    题目链接 分析: 题意很明白,不再多说了,直接分析题目,首先想一想暴力,直接枚举起点,然后求出来,时间复杂度n*n,显然不太好,所以我们考虑换一种方法枚举,当然本质还是枚举,其实你会发现变化i次和i+ ...

随机推荐

  1. 分享一个新出炉的JVM里不痛不痒的BUG(Attach机制相关)

    本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 老早之前写过一篇文章,关于attach机制的,可以看下这篇老文章了解一下JVM源码分析之Attach机制实现完全解读,比如大家常用 ...

  2. React 为什么要把事件挂载到 document 上 & 事件机制源码分析

    前言 我们都知道 React 组件绑定事件的本质是代理到 document 上,然而面试被问到,为什么要这么设计,有什么好处吗? 我知道肯定不会是因为虚拟 DOM 的原因,因为 Vue 的事件就能挂载 ...

  3. 【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件

    写在前面 在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对! ...

  4. grafana repeat 特性

    1.设置变量 成功后会自动复制变量值个数的的画图板 类似下图 设置后是不能与预览结果的,需要保存后 切换到其他dashboard 再切换回来就可以看见了 官方文档repeat说明

  5. [CF696D]Legen...

    题目   点这里看题目. 分析   首先对于模式串建立 AC 自动机,并且计算出每个状态\(p\)的贡献总和\(con(p)\).   考虑一个朴素的 DP :   \(f(i,p)\):当前串长度为 ...

  6. 迷宫城堡+算法讲解【tarjian算法】

    Tarjan 算法 参考博客:https://www.cnblogs.com/shadowland/p/5872257.html 算法讲解 Tarjan 算法一种由Robert Tarjan提出的求解 ...

  7. vsftpd服务器配置与使用

    1.ftp简介 网络文件的共享主流的主要有三种,分别为ftp.nfs.samba ftp用于internet上的控制文件的双向传输 上传和下载的操作 下载 上传 将主机中的内容拷贝到计算机上 将文件从 ...

  8. 获取ul下面最后一个li或ul中有多少个li

    获取ul下面最后一个li或ul中有多少个li 先获取ul的对象,再通过这个对象获取li的list用for循环取值text之类的 def set_city(self, base_info): quali ...

  9. snprintf和sprintf区别分析

    目录[-] snprintf函数的返回值 snprintf函数的字符串缓冲 今天在项目中使用snprintf时遇到一个比较迷惑的问题,追根溯源了一下,在此对sprintf和snprintf进行一下对比 ...

  10. Spring AOP学习笔记04:AOP核心实现之创建代理

    上文中,我们分析了对所有增强器的获取以及获取匹配的增强器,在本文中我们就来分析一下Spring AOP中另一部分核心逻辑--代理的创建.这部分逻辑的入口是在wrapIfNecessary()方法中紧接 ...