CF819B Mister B and PR Shifts 思维题
分析
这道题\(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 思维题的更多相关文章
- CF819B Mister B and PR Shifts 题解
题目 Some time ago Mister B detected a strange signal from the space, which he started to study. After ...
- codeforces 819B - Mister B and PR Shifts(思维)
原题链接:http://codeforces.com/problemset/problem/819/B 题意:把一个数列整体往右移k位(大于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
Codeforces Round #421 (Div. 2) D. Mister B and PR Shifts 题意:给一个长度为\(n\)的排列,每次可以向右循环移位一次,计算\(\sum_{i= ...
- codeforces 820 D. Mister B and PR Shifts(思维)
题目链接:http://codeforces.com/contest/820/problem/D 题意:求.有一种操作 k = 0: shift p1, p2, ... pn, k = 1: shif ...
- D. Mister B and PR Shifts
;//开两倍空间 int n; arr p,cnt; int l,r,m; ll sum = ,ans; int main() { // file("test"); sdf(n); ...
- 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)的左 ...
- CF820D Mister B and PR Shifts
题目链接:http://codeforces.com/problemset/problem/820/D 题目大意: 给出一个\(n\)元素数组\(p[]\),定义数组\(p[]\)的误差值为\(\su ...
- Mister B and PR Shifts,题解
题目链接 分析: 题意很明白,不再多说了,直接分析题目,首先想一想暴力,直接枚举起点,然后求出来,时间复杂度n*n,显然不太好,所以我们考虑换一种方法枚举,当然本质还是枚举,其实你会发现变化i次和i+ ...
随机推荐
- 嵌入式Linux内核开发工程师必须掌握的三十道题
如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师. 1. Linux中主要有哪几种内核锁?(进程同步与互斥) (1)自旋锁:非睡眠锁 (2)信号量: ...
- Zookeeper实现服务注册/发现
what that? Zookeeper在分布式开发中使用频繁,但许多框架都对其进行了封装,初学者可能无法较好的理解其工作原理,该文章演示了使用Zookeeper实现服务注册,服务发现的简单demo, ...
- svn版本库的使用
简单案例: 1.不管在哪个盘下(比如:C盘.D盘等),都先创建文件夹(这里我新建的文件夹是“项目”),创建好了就点击去,如下: 2.在自己新建的文件夹中再新建一个新的文件夹,如下: 3.选中你的文件夹 ...
- 【Spring注解驱动开发】在@Import注解中使用ImportSelector接口导入bean
写在前面 在上一篇关于Spring的@Import注解的文章<[Spring注解驱动开发]使用@Import注解给容器中快速导入一个组件>中,我们简单介绍了如何使用@Import注解给容器 ...
- css如何实现水平垂直居中
方法 居中元素定宽高固定 PC兼容性 移动端兼容性 absolute + 负margin 是 ie6+, chrome4+, firefox2+ 安卓2.3+, iOS6+ absolute + ma ...
- Uint47 calculator【map数组+快速积+各种取余公式】
Uint47 calculator 题目链接(点击) In the distant space, there is a technologically advanced planet. One day ...
- 用了那么多年的 Master 分支或因种族歧视而成为历史?
最近真的是活久见了...不知道你是否也有碰到之前Fork过的国外开源项目,最近突然崩了,原因居然是好多项目都把master分支改为了main分支!更可怕的是修改原因居然是涉及种族歧视.用了那么多年的m ...
- Java8新特性之流stream
<Java 8 实战>学习笔记系列 定义 流是Java API的新成员,它允许你以声明性方式处理数据集合,可以把它看成遍历数据集的高级迭代器 示例 List<String> t ...
- cb38a_c++_STL_算法_transform
cb38a_c++_STL_算法_transformtransform()算法有两种形式:transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间) ...
- 项目实战:Qt手机模拟器拉伸旋转框架
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...