[CF819B]Mister B and PR Shifts
题意:定义一个排列$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\leq k+n-p_k$,贡献为$n+k-p_k-i$
对$k+n-p_k+1\leq i\leq n-1$,贡献为$p_k-n-k+i$
#2若$p_k\lt k$
对$0\leq i\leq k-p_k-1$,贡献为$k-p_k-i$
对$k-p_k\leq i\leq k-1$,贡献为$p_k-k+i$
对$k\leq i\leq n-1$,贡献为$n+k-p_k-i$
区间加和,还带关于$i$的线性的项,直接打两个标记(常数,$i$的系数),最后扫一遍即可
#include<stdio.h>
#define ll long long
int p[2000010];
ll dc[4000010],dx[4000010];
ll min(ll a,ll b){return a<b?a:b;}
int main(){
int n,i,pos;
ll del,cnt,ans;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",p+i);
for(i=1;i<=n;i++){
if(p[i]>=i){
dc[0]+=(p[i]-i);
dc[i]-=(p[i]-i);
dx[0]++;
dx[i]--;
dc[i]+=(n+i-p[i]);
dc[i+n-p[i]+1]-=(n+i-p[i]);
dx[i]--;
dx[i+n-p[i]+1]++;
if(i+n-p[i]+1<=n-1){
dc[i+n-p[i]+1]+=(p[i]-n-i);
dx[i+n-p[i]+1]++;
}
}else{
dc[0]+=(i-p[i]);
dc[i-p[i]]-=(i-p[i]);
dx[0]--;
dx[i-p[i]]++;
dc[i-p[i]]+=(p[i]-i);
dc[i]-=(p[i]-i);
dx[i-p[i]]++;
dx[i]--;
if(i<=n-1){
dc[i]+=(n+i-p[i]);
dx[i]--;
}
}
}
del=cnt=0;
ans=9223372036854775807ll;
for(i=0;i<n;i++){
del+=dx[i];
cnt+=dc[i];
if(cnt+i*del<ans){
ans=cnt+i*del;
pos=i;
}
}
printf("%I64d ",ans);
if(pos==0)
putchar('0');
else
printf("%d",n-pos);
}
[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 ...
- CF819B Mister B and PR Shifts 思维题
分析 这道题\(n\leq10^{6}\),显然\(n^{2}\)的暴力是无法解决问题的 那么我们可以考虑数列的某一种性质 因为最终的答案是\(\sum{n \atop i=1} |p_i - i|\ ...
- 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= ...
- 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)的左 ...
- 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位置的数移动到数列前端,循环滚动),定义该数列的“偏差值” ...
- 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+ ...
随机推荐
- Leetcode 45. Jump Game II(贪心)
45. Jump Game II 题目链接:https://leetcode.com/problems/jump-game-ii/ Description: Given an array of non ...
- codeforces902C. Hashing Trees
https://codeforces.com/contest/902/problem/C 题意: 给你树的深度和树的每个节点的深度,问你是否有重构,如果有重构输出两个不同的结构 题解: 如果相邻节点的 ...
- APP本地服务安全测试
一.安全测试基本分类: 1.系统安全 系统加固 安全加固:比如linux中关闭telnet端口,修改ssh端口 检测一些不必要的服务(需要卸载一个ping)--保证系统的最小集 app安全加固:加一层 ...
- Spring学习--HelloWorld
Spring: Spring 是一个开源框架. Spring 是为简化企业级应用开发而生,使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是一 ...
- mybatis 关系映射
一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname ...
- 3中转换JSON数据的方式
一:前言 来公司一个星期,把最近做的东西梳理下,并把觉得有必要的知识点记载下,现在传数据很多都是用JSON来传数据,所以我就找了集中传json的方式,其实是有五种的,但是有一个我没有用过,太陌生了,上 ...
- 数据结构基础---Binary Search Tree
/// Binary Search Tree - Implemenation in C++ /// Simple program to create a BST of integers and sea ...
- Java并发编程--ThreadPoolExecutor
概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...
- COGS2090 Asm.Def找燃料
时间限制:1 s 内存限制:256 MB [题目描述] “听说咱们要完了?”比利·海灵顿拨弄着操纵杆,头也不回地问Asm.Def. “不要听得风就是雨.” “开个玩笑嘛.不就是打机器人,紧张啥,你 ...
- [bzoj2002][Hnoi2010]Bounce弹飞绵羊——分块
Brief description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装 ...