CF820D Mister B and PR Shifts
题目链接: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的更多相关文章
- 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= ...
- CF819B Mister B and PR Shifts 题解
题目 Some time ago Mister B detected a strange signal from the space, which he started to study. After ...
- D. Mister B and PR Shifts
;//开两倍空间 int n; arr p,cnt; int l,r,m; ll sum = ,ans; int main() { // file("test"); sdf(n); ...
- [CF819B]Mister B and PR Shifts
题意:定义一个排列$p_{1\cdots n}$的“偏移量”$D=\sum _{i=1}^n\left|p_i-i\right|$ 求它所有的轮换排列中偏移量最小的是多少,要求输出轮换序数 暴力就是求 ...
- 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)的左 ...
- codeforces 820 D. Mister B and PR Shifts(思维)
题目链接:http://codeforces.com/contest/820/problem/D 题意:求.有一种操作 k = 0: shift p1, p2, ... pn, k = 1: shif ...
- codeforces 819B - Mister B and PR Shifts(思维)
原题链接:http://codeforces.com/problemset/problem/819/B 题意:把一个数列整体往右移k位(大于n位置的数移动到数列前端,循环滚动),定义该数列的“偏差值” ...
- CF819B Mister B and PR Shifts 思维题
分析 这道题\(n\leq10^{6}\),显然\(n^{2}\)的暴力是无法解决问题的 那么我们可以考虑数列的某一种性质 因为最终的答案是\(\sum{n \atop i=1} |p_i - i|\ ...
- Mister B and PR Shifts,题解
题目链接 分析: 题意很明白,不再多说了,直接分析题目,首先想一想暴力,直接枚举起点,然后求出来,时间复杂度n*n,显然不太好,所以我们考虑换一种方法枚举,当然本质还是枚举,其实你会发现变化i次和i+ ...
随机推荐
- centos6.X修改ssh默认端口号
先查看下服务器端口号范围: # sysctl -a|grep ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000 新ss ...
- ASP.NET Core WebApi(01)项目建立
前言:前一段时间学习了ASP.NET Core,决定写个简单的项目,旨在消化所学内容,并记录过程中遇到的问题.本章是第一篇,内容为项目的建立 一.准备工作 安装Visual Studio时,默认会安装 ...
- 震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
这里还有数据库相关的优质文章:快戳我,快戳我
- java socket实现服务端,客户端简单网络通信。Chat
之前写的实现简单网络通信的代码,有一些严重bug.后面详细写. 根据上次的代码,主要增加了用户注册,登录页面,以及实现了实时显示当前在登录状态的人数.并解决一些上次未发现的bug.(主要功能代码参见之 ...
- Python (深浅拷贝)
1.深拷贝 --> 克隆一份,修改拷贝后的内容不对原对象内容产生影响 拷贝后修改序列中元素内容,注意:被修改的元素不能为一个序列中的某个值 a = [["北京多测师",& ...
- Spring Boot Actuator H2 RCE复现
0x00 前言 Spring Boot框架是最流行的基于Java的微服务框架之一,可帮助开发人员快速轻松地部署Java应用程序,加快开发过程.当Spring Boot Actuator配置不当可能造成 ...
- 数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)
递归 顾名思义,递归就是递归就是递归就是递归就是递归......就是递归 Google递归:
- C. Cave Painting(最小公倍数的应用)
\(\color{Red}{网上的题解都是投机取巧啊,虽然也没错}\) \(Ⅰ.先说一下投机取巧的方法\) \(自己写几个例子会发现k很小的时候满足条件的n就变得很大\) \(所以我们直接暴力从1判断 ...
- Java中的内存
目录 栈(Stack):存放的都是方法中的局部变量.方法的运行一定要在栈当中. 堆(Heap):凡是new出来的东西,都在堆内存当中 方法区(Method Area):存储.class相关信息,包含方 ...
- Java 常用API(一)
目录 Java 常用API(一) 1. Scanner类 引用类型的一般使用步骤 Scanner的使用步骤 例题 2. 匿名对象 概述 匿名对象作为方法的参数 匿名对象作为方法的返回值 3. Rand ...