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 n…
Codeforces Round #421 (Div. 2) D. Mister B and PR Shifts 题意:给一个长度为\(n\)的排列,每次可以向右循环移位一次,计算\(\sum_{i=1}^{n}|p_i - i|\)的最小值,并求最小值是在第几次移动时取到的. 思路:我们注意到对于每个\(p_i\),其位置都取遍了\(1-n\),那么可以分成\(p_i > i\) 和 $p_i <= i $两种 对于前者 每次移动贡献-1,后者贡献+1,而且我们可以容易计算出每次移动后这两者…
题目 Some time ago Mister B detected a strange signal from the space, which he started to study. After some transformation the signal turned out to be a permutation p of length n or its cyclic shift. For the further investigation Mister B need some bas…
;//开两倍空间 int n; arr p,cnt; int l,r,m; ll sum = ,ans; int main() { // file("test"); sdf(n); For(i, , n) sdf(p[i]); For(i, , n) { sum += abs(p[i] - i); if (p[i] >= i)//起始默认中立派暂属于左翼 l++,cnt[+p[i]-i]++; //左翼,第(0+p[i]-i)轮的中立者个数+1 else if (p[i] <…
题意:定义一个排列$p_{1\cdots n}$的“偏移量”$D=\sum _{i=1}^n\left|p_i-i\right|$ 求它所有的轮换排列中偏移量最小的是多少,要求输出轮换序数 暴力就是求出每个轮换排列然后计算$D$,我们不妨换个视角,看看如何计算每个$p_k$对不同排列的$D$的贡献 设$d_i$是轮换序数为$i$的轮换排列的偏移量(轮换从右往左),当前处理到$p_k$ #1若$p_k\geq k$ 对$0\leq i\leq k-1$,贡献为$p_k-k+i$ 对$k\leq i…
传送门 题意 给出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],对于答案的贡献整体…
题目链接:http://codeforces.com/contest/820/problem/D 题意:求.有一种操作 k = 0: shift p1, p2, ... pn, k = 1: shift pn, p1, ... pn - 1, ..., k = n - 1: shift p2, p3, ... pn, p1.  这样的操作,问sum值最小是多少需要操作几次 题解:这题其实只要模拟一下操作就行了复杂度为O(n)具体看一下代码. #include <iostream> #inclu…
原题链接:http://codeforces.com/problemset/problem/819/B 题意:把一个数列整体往右移k位(大于n位置的数移动到数列前端,循环滚动),定义该数列的“偏差值”:, 求在移动最少k位时,得到的最小“偏差值”. 思路:对于每个数每次往右移,其与i的差值-1,差值记为d,那么记录d>0和d<=0的位置个数:同时记录每个大于0的d的个数,保存在po数组内. 每次往右移,sum加上d<=0的个数,减去d>0的个数,对于将要移动到数列首位置的数,更新差…
分析 这道题\(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\) 记录第二类数对结果的贡献…
题目链接 分析: 题意很明白,不再多说了,直接分析题目,首先想一想暴力,直接枚举起点,然后求出来,时间复杂度n*n,显然不太好,所以我们考虑换一种方法枚举,当然本质还是枚举,其实你会发现变化i次和i+1次是由很强的关联性的,除了末尾的元素之外,i+1每个元素提供的值都会和i的相差1,而末尾元素之接特判一下就好了,我们只需要知道的是没次有多少个将会-1的(自然+1的也可以之接求得),我们来想一下这个问题,如果不考虑后面的元素回到前面,那么其实每个元素在什么时候由加变减是确定的,可以直接找到,而对于…