题目链接:http://codeforces.com/problemset/problem/820/D

题目大意:

  给出一个\(n\)元素数组\(p[]\),定义数组\(p[]\)的误差值为\(\sum\limits_{i=1}^{i=n} |p[i]-i|\).每次操作都把下标为\(n\)的数放到下标为\(1\)的位置,其他数依次右移,问在通过几次操作后能使得误差值最小

知识点:  (void)

解题思路:

  见注释。

AC代码:

 #include <bits/stdc++.h>

 using namespace std;
typedef long long ll;
const int maxn=1e6+;
ll p[maxn],has[maxn<<]; int main(){
ll n;
ll bigger=,smaller=,equ=,ans1=,ans2=; //bigger 记录目前比其下标大的数的个数,small 记录比其下标小的,equ 记录等于其下标的,最终输出是 ans1 ans2
scanf("%I64d",&n);
for(ll i=1LL;i<=n;i++){
scanf("%I64d",&p[i]);
if(p[i]>i){
bigger++;
has[p[i]-i]++; //has[X] 记录比下标大 X 的数的个数
}
else if(p[i]==i){
equ++;
has[]++;
}
else smaller++;
ans1+=abs(p[i]-i);
}
ll temp=ans1; //临时记录ans1 //首先,请注意:我后面提到的数字其实都是数字与下标的差值,因为我们着重研究的是这个
for(ll last=n-1LL,now=1LL;last>=1LL;last--,now++){ //last 记录目前下标为n的数的位置;now 记录目前是第几号变换,在此处理解为一条“零线”,除了下标为n的数之外的所有数减去 now 即为现在的数
temp+=(equ+smaller);
temp-=bigger; //从 now-1 变换到 now 后,所有数的下标加一(不考虑下标为n的数),则原来小于或等于下标的数对于ans1的贡献值增大1,大于下标的数对于ans1的贡献值减小1 smaller+=equ; //原本等于下标的数都变成小于了
bigger-=has[now]; //原本等于 now+1(即现在的now, 其实就是原本等于1)的数现在都变成了0
//接下来处理之前下标是n,现在下标是1的数
if(p[last+]>=last+1LL)
has[p[last+]-last-]--; //先抹除其原来在has[]中的记录
has[p[last+]-+now]++; //重新记录,注意:此时的“零线”已经抬高了,相应的也要加上 now
equ=has[now]; //新的equ其实就是那些现在在“零线”上的数
if(p[last+]>1LL) bigger++;
smaller=n-equ-bigger; //显然,smaller + equ + bigger = n temp-=abs(p[last+]-n-1LL); //特殊处理原本下标为n的数
temp+=abs(p[last+]-1LL);
if(temp<ans1){
ans1=temp;
ans2=now;
}
}
printf("%I64d %I64d\n",ans1,ans2); return ;
}

  

CF820D Mister B and PR Shifts的更多相关文章

  1. 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= ...

  2. CF819B Mister B and PR Shifts 题解

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

  3. D. Mister B and PR Shifts

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

  4. [CF819B]Mister B and PR Shifts

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

  5. 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)的左 ...

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

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

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

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

  8. CF819B Mister B and PR Shifts 思维题

    分析 这道题\(n\leq10^{6}\),显然\(n^{2}\)的暴力是无法解决问题的 那么我们可以考虑数列的某一种性质 因为最终的答案是\(\sum{n \atop i=1} |p_i - i|\ ...

  9. Mister B and PR Shifts,题解

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

随机推荐

  1. mybatis源码学习(三):MappedStatement的解析过程

    我们之前介绍过MappedStatement表示的是XML中的一个SQL.类当中的很多字段都是SQL中对应的属性.我们先来了解一下这个类的属性: public final class MappedSt ...

  2. USACO Training Section 1.1 Your Ride Is Here

    题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走 ...

  3. nnIPXougCC

    13:58:31           2020-03-14 发现一本书叫做<活法> 学习ing 2020-03-14 15:22:36 太快 ,练习了一会sql语句和打字 想看一会 憨豆特 ...

  4. Java——Spring超详细总结

    Spring概述 一.简化Java开发 Spring为了降低Java开发的复杂性,采用了以下四种策略 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯例进行声明 ...

  5. Java——抽象类与接口的前世今生

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...

  6. OpenCV 4下darknet修改

    darknet的安装使用直接在官网上获取.https://pjreddie.com/darknet/ 但我用的是OpenCV4.1.1,make时会在image_opencv.cpp中有两个错误. 1 ...

  7. qt creator源码全方面分析(4-3)

    内外命名空间 QtCreator源码中,每一个子项目都有内外两层命名空间,一个是外部的,一个是内部的. 示例如下 namespace ExtensionSystem { namespace Inter ...

  8. Mysql 常用函数(1)- 常用函数汇总

    Mysql常用函数的汇总,可看下面系列文章 Mysql常用函数有哪几类 数值型函数 字符串型函数 日期时间函数 聚合函数 流程控制函数 数值型函数 函数名称 作用 ABS 求绝对值 SQRT 求二次方 ...

  9. 瞬间教你学会使用java中list的retainAll方法

    retainAll方法简介 当我们有两个list集合的时候,我们可以使用retainAll方法求得两个list集合的子集.retainAll是Collection接口中提供的一个方法,各个实现类有自己 ...

  10. electron——通知

    所有三个操作系统都提供了应用程序向用户发送通知的手段. Electron允许开发者使用 HTML5 Notification API 发送通知,并使用当前运行的操作系统的本地通知 API 来显示它. ...