传送门

NOIP2013原题

貌似官方数据都是一模一样的

以前写过竟然毫无印象?

考场上自己瞎JB推结论

显然,如果连续的两端区间可以左边区间减 k 次,右边区间也减 k 次

那么把两个区间合并起来一起减 k 次一定是更优的

所以先考虑把整个区间拿来减几次,显然最多减的次数就是整个区间的最小值

然后此时最小值已经为零了,以最小值的位置分成左右两个区间继续同样处理就好了

如果每个区间都扫一遍最小值复杂度可以卡成 $O(n^2)$,(单调序列)

所以区间最小值容易想到ST表

然后复杂度 $O(nlog_n)$ (预处理ST表的复杂度)

话说官方数据 $O(n^2)$ 也能过....

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
int n,a[N],pos[N][],Log[N];
ll ans;
void pre()//预处理ST表
{
Log[]=-; for(int i=;i<=n;i++) Log[i]=Log[i>>]+;
for(int i=;i<=n;i++) pos[i][]=i;
for(int i=;(<<i)<=n;i++)
for(int j=;j+(<<(i-))<=n;j++)
{
if(a[ pos[j][i-] ]>a[ pos[j+(<<(i-))][i-] ]) pos[j][i]=pos[j+(<<(i-))][i-];
else pos[j][i]=pos[j][i-];
}
}
inline int query(int l,int r)//区间求最小值
{
int k=Log[r-l+];
if(a[ pos[l][k] ]>a[ pos[r-(<<k)+][k] ]) return pos[r-(<<k)+][k];
return pos[l][k];
}
void f(int l,int r,int tot)//递归处理左右区间,tot是当前已经进行的操作次数
{
if(l>r) return;
int t=query(l,r);
ans+=a[t]-tot;
f(l,t-,a[t]); f(t+,r,a[t]);
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
n=read();
for(int i=;i<=n;i++) a[i]=read();
pre();
f(,n,);
cout<<ans<<endl;
return ;
}

最新文章

  1. Struts的拦截器
  2. uva 107 - The Cat in the Hat
  3. uboot环境变量与内核MTD分区关系
  4. I/O复用-select模型
  5. 6、第六课,js jquery20150928
  6. Qt:基于TCP和UDP的局域网P2P(局域网)通讯封装
  7. EasyUI - Messager消息框
  8. VS2012的安装项目只能用InstallShield Limited Edition
  9. POJ 2231 Moo Volume
  10. PyTorch官方中文文档:自动求导机制
  11. django/python日志logging 的配置以及处理
  12. const修饰指针+volatile +restrict
  13. django channle的使用
  14. C#操作DataTable类
  15. Python6 - 函数总结
  16. luogu P2015 二叉苹果树
  17. SQL 二
  18. UVALive 6529 Eleven 区间dp
  19. Oracle 性能调优案例(代码级别)
  20. dirname 和 basename

热门文章

  1. PHP通过加锁实现并发情况下抢码功能
  2. 【总结整理】天地图WMTS服务与卫星图匹配与坐标转换
  3. 02 mybatis环境搭建 【spring + mybatis】
  4. Ubuntu,kubuntu与xubuntu的差别 Ubuntu各版本主要差异
  5. 算法Sedgewick第四版-第1章基础-012一用stack实现输出一个数的二进制形式
  6. ZROI2018普转提day1t1
  7. debug配置
  8. String的字符串相加是怎么实现的?
  9. 关于 windows mobile 进程操作的方法
  10. C++面试笔记--const、sizeof