题目链接:

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. 使用dbms_metadata.get_ddl遇到ORA-31603

    建了一个外部表,想看看这个表的信息,一查就报错了: SQL> select dbms_metadata.get_ddl('TABLE','ext_case1') from dual; ERROR ...

  2. 【BZOJ 1878】 HH的项链

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1878 [算法] 显然,在线算法是不可做的,考虑离线算法 笔者的做法是莫队算法,时间复 ...

  3. Windows下用Visual Studio来build ImageMagick

    参考: http://www.imagemagick.org/script/install-source.php#windows http://blog.163.com/anteaus_20/blog ...

  4. oracle数据泵备份与还原

    完整的常用的一套oracle备份以及还原方案 --在新库中新建数据目录,我没有特别说明在哪执行的语句都可在plsql中执行 CREATE OR REPLACE DIRECTORY dump_dir A ...

  5. QT-项目文件说明

    前言:如题. 一.项目文件概述 文件 功能 helloworld.pro 包含了项目信息 helloworld.pro.user 用户信息 hellodialog.h 自定义类hellodialog的 ...

  6. 服务端 | Linux 学习总结 (一)

    http://billie66.github.io/TLCL/book/ 1.Ubuntu && linux shell 命令 Ubuntu两个重要版本:12.04和14.04 在终端 ...

  7. XP访问WIN10共享打印机提示错误:操作无法完成,拒绝访问

    XP系统添加打印机--连接到此计算机的本地打印机(取消自动检测)--创建新端口(LOCAL port)----输入端口名\\计算机名\打印机名.(例如:\\adubei\\HP lasjet 1020 ...

  8. JS怎样计算过关分数

    一个游戏,前20关是每一关自身的分数,//21-30关每一关是10分//31-40关,每一关是20分//41-49关,每一关是30分//50关,是100分 <!DOCTYPE html> ...

  9. js 时间戳 中国标准时间 年月日 日期之间的转换

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Linux(1)---常用命令

    1.将tgz文件解压到指定目录: # tar zxvf test.tgz -C 指定目录 比如将 /lyl/test.tgz解压到 /lyl/linux 目录下 # tar zxvf /lyl/tes ...