题目链接:

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. vue中 router-link 传递参数以及获取

    将所遇见的问题一步一步记录下来,不久便会成长 今天在修改前端(vue) BUG的时候遇见 router-link标签,传递参数到另一个页面,确不知道参数在另一个页面怎么接收,于是找度娘需求解决办法,最 ...

  2. BZOJ 4184 线段树+高斯消元

    思路: 线段树表示的是时间 每回最多log个段 区间覆盖 一直到叶子 的线性基 xor 一下 就是答案 一开始没有思路 看了这篇题解 豁然开朗 http://www.cnblogs.com/joyou ...

  3. 最简单的启动并连接一个redis的docker容器

    启动一个容器: $ sudo docker run --name <name> -d redis 连接一个容器: sudo docker run -it --link <name&g ...

  4. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转

    原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...

  5. C#.NET编码规范

    一. 环境设置 首先去除开发环境中的一些选项如下: 图一 图二 二. 命名规范 1) 通用性 l 标识的总长度不要超过32个字符. l  标识符的基本语法是以字母和_开始,由字母数字及下划线组成的单词 ...

  6. JS实现掷骰子

    JS实现掷骰子 实现方法: 方法一:通过background-position.background-image.backg-repeat三个属性以及jquery animate()方法改变背景骰子图 ...

  7. css实战笔记(一):写网页前的reset工作

    reset.css是每个html必备的样式,其中有各种元素属性清零的代码. 为什么要有reset.css 让各个浏览器的CSS样式有一个统一的基准,比如清除各个浏览器为元素自带的margin.padd ...

  8. windows及git常用命令

    windows常用命令: 创建文件夹:md 文件夹名 创建空的文件:type nul>文件名 创建有内容文件:echo "内容">文件名 查看文件内容:type +文件 ...

  9. 一个vue的全局提示框组件

    <template> <!-- 全局提示框 --> <div v-show="visible" class="dialog-tips dia ...

  10. python写的爬虫工具,抓取行政村的信息并写入到hbase里

    python的版本是2.7.10,使用了两个第三方模块bs4和happybase,可以通过pip直接安装. 1.logger利用python自带的logging模块配置了一个简单的日志输出 2.get ...