题目链接:

http://172.16.0.132/senior/#main/show/5343

题目:

题解:

记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献

若$s_i<i$:

对$ans_0,..,ans_{i-s_i}$,贡献分别是$i-s_i,i-s_i-1,...,0$

对$ans_{i-s_i+1},...,ans_{i-1}$,贡献分别是$1,...,s_i-1$

对$ans_i,...,ans_{n-1}$,贡献分别是$n-s_i,...,i+1-s_i$

若$s_i=i$:

对$ans_0$,贡献是$0$

对$ans_1,...,ans_{i-1}$,贡献分别是$1,...,i-1$

对$ans_i,...,ans_{n-1}$,贡献分别是$n-i,...,1$

若$s_i>i$:

对$ans_0,...,ans_{i-1}$,贡献分别是$s_i-i,...,s_i-1$

对$ans_i,...,ans_{i+n-s_i}$,贡献分别是$n-s_i,...,0$

对$ans_{i+n-s_i+1},...,ans_{n-1}$,贡献分别是$1,...,s_i-i-1$

发现都是公差为$1$或$-1$的等差数列,显然线段树可以维护,但是数据范围不允许而且我们也不需要。怎么办呢?我们差分

对ans数组二阶差分即可,注意二阶差分的同时需要在一阶差分消去影响

注意差分的题目手动模拟是很有必要的,每个差分独立考虑

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll; const int N=2e6+;
const ll inf=1e15;
int n;
ll s[N],cha1[][N],cha2[][N],a[N],b[N],p[N];
inline int read(){
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int main()
{
n=read();
for (int i=;i<=n;i++) s[i]=read();
for (int i=;i<=n;i++)
{
if (s[i]<i)
{
if (<=i-s[i]) cha2[][i-s[i]-]++;
if (i-s[i]+<=i-) {cha1[][i-s[i]+]++;cha1[][i]--;cha1[][i]-=s[i]-;}
if (i<=n-) {cha2[][n-]++;cha2[][i-]--;cha2[][n-]+=i-s[i];cha2[][i-]-=n-s[i];}
}
if (s[i]==i)
{
if (i-s[i]+<=i-) {cha1[][]++;cha1[][i]--;cha1[][i]-=i-;}
if (i<=n-) {cha2[][n-]++;cha2[][i-]--;cha2[][i-]-=n-i;}
}
if (s[i]>i)
{
if (<=i-) {cha1[][]++;cha1[][i]--;cha1[][]+=s[i]-i-;cha1[][i]-=s[i]-;}
if (i<=i+n-s[i]) {cha2[][i+n-s[i]-]++;cha2[][i-]--;cha2[][i-]-=n-s[i];}
if (i+n-s[i]+<=n-) {cha1[][i+n-s[i]+]++;cha1[][n]--;cha1[][n]-=s[i]-i-;}
}
}
for (int i=;i<n;i++) p[i]=p[i-]+cha1[][i];
for (int i=;i<n;i++) cha1[][i]+=p[i];
for (int i=n-;i>=;i--) p[i]=p[i+]+cha2[][i];
for (int i=n-;i>=;i--) cha2[][i]+=p[i];
for (int i=;i<n;i++) a[i]=a[i-]+cha1[][i];
for (int i=n-;i>=;i--) b[i]=b[i+]+cha2[][i];
ll mi=inf;
for (int i=;i<n;i++) mi=min(mi,a[i]+b[i]);
printf("%lld\n",mi);
return ;
}

[jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)的更多相关文章

  1. [jzoj 6087] [GDOI2019模拟2019.3.26] 获取名额 解题报告 (泰勒展开+RMQ+精度)

    题目链接: https://jzoj.net/senior/#main/show/6087 题目: 题解: 只需要统计$\prod_{i=l}^r (1-\frac{a_i}{x})$ =$exp(\ ...

  2. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  3. JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)

    5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...

  4. JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列

    5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...

  5. JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨

    5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...

  6. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  7. 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】

    目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...

  8. [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)

    题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...

  9. NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)

    题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...

随机推荐

  1. oracle init.ora常用配置详解

    参考网上整理了重要的配置文件 db_name = "51cto"   一个数据库标识符,应与CREATE DATABASE 语句中指定的名称相对应. instance_name = ...

  2. 2017-3-5 leetcode 442 531 533

    今天莫名其妙睡到了中午,很难受... leetcode442 https://leetcode.com/problems/find-all-duplicates-in-an-array/?tab=De ...

  3. Java-MyBatis-3.0:MyBatis 3 简介

    ylbtech-Java-MyBatis-3.0:MyBatis 3 简介 1.返回顶部 1. 简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程 ...

  4. CentOS7开启网络配置

    虚拟机在安装时可以开启网络 如果没有开启的话 可以通过以下操作 ip  addr 查看是否开启网络 没有开启的话 cd /etc/sysconfig/network-scripts/ 然后 执行 ls ...

  5. sql导出到excel

    1.先查询数据ID,别名  导出到excel 2.增加标准名称,标识错误数据,导入sqlServer select distinct [StandardName] from [GMSOA].[dbo] ...

  6. 查看网站域名IP地址

    运行:CMD 输入: Nslookup 网站地址 示例: Nslookup httpwww.baidu.com 我们是筑梦团队,我们的座右铭是:当提起逐梦的脚步,也请举起筑梦的双手

  7. 杭电 1114 Piggy-Bank【完全背包】

    解题思路,首先很容易想到方程f[v]=min(f[v],f[v-w[i]+p[i]),因为是要求当包装满的时候(因为题目中给出的是包的质量是一定的),包里面装的钱最少,所以将f[]初始化成一个很大的数 ...

  8. CDR 2017压感笔和压感设备该怎么设置使用?

    您可以通过CorelDRAW 2017 中的以下工具来运用压感笔.笔或其他设备的压力:艺术笔(表达模式).橡皮擦.涂抹.转动.吸引.排斥.粗糙和弄脏.此外,您还可以通过艺术笔(表达模式)工具.橡皮擦. ...

  9. js单体内置对象

    js单体内置对象:js的内置对象,是ECMAScritp提供的.不依赖于宿主环境的对象,我的理解就是在我们开发之前js里面就已经存在的对象.单体内置对象就是是不需要通过new来实例化的,例如我们的st ...

  10. dataTable 动态列 二次加载

    需要把 列头和表格内容全部清空 if ($('#datatable').hasClass('dataTable')) { var dttable = $('#datatable').dataTable ...