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)的左偏差,用L记录一个数在标准位置左边/上的个数,R为在右边的个数,关键在于n-1次移动中如何更新\(min\sum_{i=1}^nabs(p_i-i)\)
先不考虑末尾移到第一位,如果右移一位,那么有cnt[i]个元素滚到标准位置的右边了,那么L-=cnt[i],R+=cnt[i],对于答案的贡献整体来看,每次都会减少L,增加R(请仔细思考)。接下来考虑末尾的元素跑到第一位,毫无疑问L++,R--,从(n,p[n-i])跑到(1,p[n-i]对于答案的贡献为(p[n-i]-1)+(n-p[n-i)。(请仔细思考),同时由于多减了1(右移L时未把末尾元素放到第一位),所以sum要加1,最后考虑末尾p[n-i]移到n-i的花费也要++,故cnt[p[n-i]+i]++,不妨列几个数试验试验。(请仔细思考),每次更新答案
相似blog
Jaihk662
Joovo
trick
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
//#pragma comment(linker, "/STACK:102400000,102400000")
//inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
const int maxn=1e6+10;
int n,L,R;
int p[maxn],cnt[maxn*2];//记录与实际位置偏差的距离,如p[2]=3 那么与实际位置3偏差1
ll ans,sum;
int main()
{
scanf("%d",&n);
F(i,1,n)
{
scanf("%d",p+i);sum+=abs(p[i]-i);
if(p[i]>=i) cnt[p[i]-i]++,L++;else R++;//L表示在实际位置的左边/上的数的个数,R表示在实际位置的右边的数的个数
}
ans=sum;
int loc=0;
R(i,0,n-1)//从p[n]枚举到p[2]
{
L=L-cnt[i]+1,R=R+cnt[i]-1;//表示做第i+1次偏移对结果的影响,每次移动L减少cnt[i],R增加cnt[i],由于末尾元素移到第一位,故R--,L++
cnt[(p[n-i]+i)>n?(p[n-i]+i)%n:(p[n-i]+i)]++;//表示p[n-i]移到实际位置p[n-i]需要的花费,举个例子 3 2 4 5 1,一次op后1 3 2 4 5,cnt[1]++;二次op后5 1 3 2 4,cnt[6]++
sum=sum-L+R-abs(n-p[n-i])+abs(p[n-i]-1)+1;//最后一个数从abs(p[n-i]-n)变成abs(p[n-i]-1),表示从末尾到1的花费
if(sum<ans) ans=sum,loc=i+1;//更新答案
}
printf("%I64d %d\n",ans,loc);
return 0;
}
Codeforces Round #421 (Div. 2)D - 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= ...
- Codeforces Round #421 (Div. 2)B. Mister B and Angle in Polygon(模拟+精度控制)
传送门 题意 给出正n多边形和一个数a,寻找与a最接近的角,输出角编号 分析 找出多边形上所有角,一一比对即可 trick 1.判断的时候注意精度,i.e.x-eps>0 2.double与do ...
- Codeforces Round #421 (Div. 1) (BC)
1. 819B Mister B and PR Shifts 大意: 给定排列$p$, 定义排列$p$的特征值为$\sum |p_i-i|$, 可以循环右移任意位, 求最小特征值和对应移动次数. 右移 ...
- 【Codeforces Round #421 (Div. 2) B】Mister B and Angle in Polygon
[题目链接]:http://codeforces.com/contest/820/problem/B [题意] 给你一个正n边形; 然后让你在这正n边行中选3个点,组成一个角; 找出角的大小和所给的角 ...
- 【Codeforces Round #421 (Div. 2) A】Mister B and Book Reading
[题目链接]:http://codeforces.com/contest/820/problem/A [题意] 每天看书能看v页; 且这个v每天能增加a; 但是v有上限v1; 然后每天还必须往回看t页 ...
- Codeforces Round #421 (Div. 2) - B
题目链接:http://codeforces.com/contest/820/problem/B 题意:给定一个正n边形,然后让你选择3个不同的顶点,使得这3个顶点形成的角度尽可能的接近a. 思路:首 ...
- Codeforces Round #421 (Div. 2) - A
题目链接:http://codeforces.com/contest/820/problem/A 题意:一个人在看一本书,书一共C页,这个人每天看v0页,但是他又开始加速看这本书,每天都比前一天多看a ...
- Codeforces Round #421 (Div. 2)
A: 题意:给你一本书共c页,第一天看v0页,第二天看v0+a,第二天看v0+2a以此类推,每天最多看v1页,但是后一天要重复看前一天的后l页. 代码: #include<stdio.h> ...
- Codeforces Round #364 (Div.2) D:As Fast As Possible(模拟+推公式)
题目链接:http://codeforces.com/contest/701/problem/D 题意: 给出n个学生和能载k个学生的车,速度分别为v1,v2,需要走一段旅程长为l,每个学生只能搭一次 ...
随机推荐
- [转] twemproxy ketama一致性hash分析
评注:提到HAProxy业务层proxy, twemproxy存储的proxy. 其中还提到了ketama算法的实现源码 转自:http://www.cnblogs.com/basecn/p/4288 ...
- java设计模式----其他模式
1.桥接:使用桥接模式不只改变你的实现,也改变你的抽象 优点: 将实现予以解耦,让它和界面之间不再永久绑定 抽象和实现可以独立扩展,不会影响到对方 对于“具体的抽象类”所做的改变,不会影响到客户 用途 ...
- testng 工程报错java.net.SocketException
报错如下: java.net.SocketException: Software caused connection abort: socket write error at java.net.Soc ...
- 设计模式学习笔记——Decorator装饰模式
装饰模式的作用或动机就是,尽量避免继承,而使用关联.原因是层层继承下来,内容会越来越多,有失控的危险.就扩展性而言,用关联比用继承好.所谓的关联,A使用了B,就叫A关联了B. Component 抽象 ...
- SenTestingKit.framework的报错!
本文转载至http://www.cocoachina.com/ask/questions/show/106912 ld: building for iOS Simulator, but linking ...
- java的gradle项目的基本配置
plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring ...
- CentOS笔记-目录结构(转载了菜鸟教程里的)
在linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件. /etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动. /b ...
- hadoop 一些文件操作
在HDFS上面,FileSystem创建目录 复制本地文件到HDFS 获取集群中的节点
- yum lock
状态 :睡眠中,进程ID:18439Another app is currently holding the yum lock; waiting for it to exit... 另一个应用程序是: ...
- Apache Flink 1.5.1 Released
Apache Flink: Apache Flink 1.5.1 Released http://flink.apache.org/news/2018/07/12/release-1.5.1.html ...