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+ ...
随机推荐
- Charles(青花瓷/花瓶)的基本使用
前言 Charles 其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的.其次该软件是用 Java 写的,能够在 Windows,Mac,Linux 上使用. ...
- 08_提升方法_AdaBoost算法
今天是2020年2月24日星期一.一个又一个意外因素串连起2020这不平凡的一年,多么希望时间能够倒退.曾经觉得电视上科比的画面多么熟悉,现在全成了陌生和追忆. GitHub:https://gith ...
- Oracle 11g RAC之HAIP相关问题总结
1 文档概要 2 禁用/启用HAIP 2.1 禁用/启用HAIP资源 2.2 修改ASM资源的依赖关系 3 修改cluster_interconnects参数 3.1 使用grid用户修改ASM实例的 ...
- 【微信H5】 Redirect_uri参数错误解决方法
1 https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx14127af0bc9fd367&redirect_uri=http ...
- Supervisor操作相关的进程
Supervisor是用Python开发的一个客户机/服务器系统,允许用户监视和控制UNIX类操作系统上的多个进程. 功能:用于监听.启动.停止.重启一个或多个进程. 当Supervisor管理的进程 ...
- [xDebug]Xdebug和Sublime调试PHP代码
安装xdebug 省略... 配置sublime 要调试某一个项目,首先得把这个项目在sublime下保存成一个project sublime->project->save project ...
- @atcoder - AGC034F@ RNG and XOR
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个值域在 [0, 2^N) 的随机数生成器,给定参数 A[ ...
- MySQL数据库基础知识复习
现在是2020年寒假,这也是新年写的第一篇博客,用了十几天的时间自学了数据库基础部分,想总结一下得失同时并通过写博客来复习前面学的知识点. 个人: 1.本来是计划一周学完基础部分的178p但没能完成这 ...
- TensorFlow从0到1之回归算法(11)
回归是数学建模.分类和预测中最古老但功能非常强大的工具之一.回归在工程.物理学.生物学.金融.社会科学等各个领域都有应用,是数据科学家常用的基本工具. 回归通常是机器学习中使用的第一个算法.通过学习因 ...
- c常用函数-strlwr 和 strupr
strlwr 和 strupr strlwr的功能是把一个字符串全部变成小写, strupr的功能则是把一个字符串全部变成大写.语法结构分别如下: Action() { char test[] = & ...