原题链接 洛谷链接
题目翻译
洛谷Blog 求赞

题意就不赘述了

考虑贪心,显然每轮最开始调到第一个 s i s_i si​ 不为 1 1 1 的蹦床上是最优的,因为这样可以让后面的 s s s 尽可能减少。
定义 c i c_i ci​ 为位置 i i i 已经被踩了多少次

那么,我们贪心的从 1 1 1 开始枚举跳到的第一个蹦床,设当前枚举到第 i i i 个蹦床
由于最终这个蹦床的 s i s_i si​ 会被踩到只剩 1 1 1,所以肯定会对区间 [ i + 2 , min ⁡ ( i + s i , n ) ] [i+2,\min(i+s_i,n)] [i+2,min(i+si​,n)] 的蹦床造成 1 1 1 点贡献(后面会讲到对 i + 1 i+1 i+1 的贡献)
由于在正常情况下,当蹦床的 s i s_i si​ 达到 1 1 1 的时候,就不会再从它开始起跳了,所以这样就不会对 i + 1 i+1 i+1 造成贡献。只有当 s i − c i < 1 s_i-c_i<1 si​−ci​<1 的时候,也就是说从别的地方跳过来,才可以对 i + 1 i+1 i+1 做出贡献。所以蹦床 i i i 对 i + 1 i+1 i+1 做出的贡献为 max ⁡ ( 0 , 1 − ( s i − c i ) ) \max(0,1-(s_i-c_i)) max(0,1−(si​−ci​))

在考虑完对后面蹦床的贡献后,我们考虑蹦床 i i i 对最终答案的贡献。这个其实非常简单,就不细说了,贡献: max ⁡ ( 0 , ( s i − c i ) − 1 ) \max(0,(s_i-c_i)-1) max(0,(si​−ci​)−1)

总时间复杂度 O ( T ⋅ n log ⁡ n ) \mathcal O(T\cdot n\log n) O(T⋅nlogn)
PS: 为了美观并且方便理解,这里只提供未开long long的代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Maxn=5010;
int n,ans;
int a[Maxn],sum[Maxn];
inline int lowbit(int x)
{return x&(-x);
}
void modify(int x,int v)
{if(x>n || x<1)return;while(x<=n){sum[x]+=v;x+=lowbit(x);}
}
int query(int x)
{int ret=0;while(x){ret+=sum[x];x-=lowbit(x);}return ret;
}
inline int read()
{int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return s*w;
}
int main()
{// freopen("in.txt","r",stdin);int T=read();while(T--){n=read();for(int i=1;i<=n;++i)a[i]=read(),sum[i]=0;for(int i=1;i<=n;++i){int tmp=a[i]-query(i);if(tmp>1)ans+=tmp-1;if(a[i]>1)modify(i+2,1),modify((i+a[i])+1,-1);if(tmp<1ll)modify(i+1,1-tmp),modify(i+2,tmp-1);}printf("%lld\n",ans);ans=0;}return 0;
}

Update: 03.04: 发现这个做法好像可以优化到 O ( n ) \mathcal O(n) O(n)。
我们把树状数组换成差分,但看上去似乎差分只能支持区间修改,不支持在线的查询。
但是,可以发现这些操作具有一些良好的性质:

  1. 查询操作是从前往后依次查询的,也就是 1 … n 1\dots n 1…n 的位置都被挨个查了一遍。
  2. 当我们查询完位置 i i i,之后的所有修改都不会跟 1 … i 1\dots i 1…i 有关系。

那么,我们可以在枚举蹦床的时候维护差分数组,也就是 sum[i]+=sum[i-1]。这样,单次查询和修改就都是 O ( 1 ) \mathcal O(1) O(1) 的了。
总时间复杂度 O ( n ) \mathcal O(n) O(n)。

代码仍旧未开long long

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Maxn=5010;
int n,ans;
int a[Maxn],sum[Maxn];
inline int read()
{int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return s*w;
}
int main()
{// freopen("in.txt","r",stdin);int T=read();while(T--){n=read();for(int i=1;i<=n;++i)a[i]=read(),sum[i]=0;for(int i=1;i<=n;++i){sum[i]+=sum[i-1];int tmp=a[i]-sum[i];if(tmp>1)ans+=tmp-1;if(a[i]>1){if(i+2<=n)sum[i+2]++;if(i+a[i]+1<=n)sum[i+a[i]+1]--;}if(tmp<1){if(i+1<=n)sum[i+1]+=(1-tmp);if(i+2<=n)sum[i+2]-=(1-tmp);}}printf("%lld\n",ans);ans=0ll;}return 0;
}

CF1491C Pekora and Trampoline相关推荐

  1. cf1491C. Pekora and Trampoline

    cf1491C. Pekora and Trampoline 题意: 有n个蹦床,每个蹦床有它的弹力值bib_{i}bi​,从i蹦床起跳可以落到i+bii+b_{i}i+bi​的位置上(前提是这个位置 ...

  2. CodeForces - 1491C Pekora and Trampoline(差分+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列 aaa,aia_iai​ 表示第 iii 个蹦床的强度,当从第 iii 个蹦床起跳的话可以跳到 i+aii+a_ii+ai​ 的位置,但是 ...

  3. [CF/AT]各大网站网赛 体验部部长第一季度工作报告

    文章目录 CodeForces #712 (Div. 1)--1503 A. Balance the Bits B. 3-Coloring C. Travelling Salesman Problem ...

  4. Codeforces Global Round 13 C

    C. Pekora and Trampoline 题意:对于数组a,每次出发开始可以选择任意元素作为起始点,然后在数组上移动,落点为i + a[i],直至超出数组范围,每次经过的点的值减一(先移动再减 ...

  5. 详解Clojure的递归(下)——相互递归和trampoline

    详解clojure递归(上)     详解clojure递归(下)         这篇blog拖到现在才写,如果再不写,估计就只有上篇没有下篇了,趁周末写一下. 上篇提到了Clojure仅支持有限的 ...

  6. react-native trampoline实现

    ReactNative有Profiler的功能,能计算每个函数的执行耗时.为了尽量减少测量代码对函数本身执行的影响,ReactNative采用汇编实现Trampoline来实现该功能.本文主要记录该部 ...

  7. react-native trampoline实现 1

    ReactNative有Profiler的功能,能计算每个函数的执行耗时.为了尽量减少测量代码对函数本身执行的影响,ReactNative采用汇编实现Trampoline来实现该功能.本文主要记录该部 ...

  8. eBPF Talk: 比 kprobe 更好的 trampoline

    eBPF trampoline(trampoline:蹦床,翻译后并不好理解,所以不作翻译)是内核函数和 eBPF 程序之间的桥梁,基于 register_ftrace_direct() 实现.它实现 ...

  9. 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...

    为什么80%的码农都做不了架构师?>>>    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS> ...

最新文章

  1. cad的文字嵌入线条_带你玩转CAD!
  2. Java设计模式-外观模式
  3. Java黑皮书课后题第9章:*9.5(使用GregorianCalendar类)Java API中有一个位于包java.util中的类GregorianCalendar
  4. css3-11 如何实现2D动画
  5. vue 筛选组件_记一个复杂组件(Filter)的从设计到开发
  6. while(1)和while(0)
  7. 吴恩达机器学习笔记三之逻辑回归
  8. jQuery获取元素索引值index()方法
  9. cuda linux 算力_华为AI再进化,CANN 3.0释放算力狂魔
  10. Python中多线程thread与threading的实现方法
  11. 可以声明一个抽象类类型变量_TypeScript系列(二)变量声明和数据类型
  12. zuul 自定义路由映射规则
  13. matlab绘制图形hold on_Matlab绘图示例
  14. 做高级PPT的一点经验
  15. 北京市三级医院电话预约挂号一览表
  16. 小米手机-解BL锁+开ROOT权限
  17. librosa提取mel_fbank
  18. 树形表实现 bootstrap-table + treegrid
  19. 基于健康档案的区域卫生信息平台-总体架构图
  20. vue中element国际化语言切换

热门文章

  1. 电脑不能正常关机解决办法
  2. 爬虫——隐藏的url获取教学
  3. 导出微信通讯录到 Excel
  4. abap中的BAPI_ASSET_RETIREMENT_POST (固定资产报废BAPI)
  5. 上位机实现can报文的周期性发送(python3)
  6. 虚拟乐器合集 – Steinberg Absolute 4 VST Instrument Collection
  7. 诺基亚n1装入Linux系统,将Linux系统装入U盘,打造便携式操作系统
  8. C++Opencv中Mat类型创建与读取某点像素值
  9. 隐形牙套牙齿矫正水深套路多?选对产品很重要
  10. NodeJS代码直接发送文件及接收