题意:给定一个数组A,以及一个初始值全为0的空数组B,每次可以对数组B的任意一个区间内的所有数+x,问至少几次操作能把B数组变成A数组

NOIP原题(积木大赛)升级版,话说CS怎么那么多跟NOIP原题差不多的题目,我上次还看见一道拦截导弹来着。。。

言归正传,一开始想贪心,后来发现可以构造出反例,想了一会没什么好办法就去看题解了。题解的解释非常巧妙,他将序列当作一堆矩形竖直排列在一起,最终答案就是矩形的分割数,如下:

看到这里我似乎也知道该怎么做了。我们考虑序列一开始只有一个矩形的状况,加入一个新矩形时,其对答案产生贡献当且仅当它的高度不等于第一个矩形时。可以发现这个结论可以推广到N个矩形中,如果新加入矩形的高度在相邻的不降序列中出现过,那么它将对答案产生贡献。于是维护一个单调栈即可。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200000+10
int n,top=,ans=,st[MAXN],vis[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;
scanf("%d",&x);
while(st[top]>x)vis[st[top--]]--;
if(!vis[x])ans++;
st[++top]=x;
vis[x]++;
}
printf("%d\n",ans);
return ;
}

最新文章

  1. 后台接收URL地址的参数
  2. Linux 文件与目录管理
  3. iOS8定位问题解决方案
  4. thinkphp 关联模型配置代码
  5. Alloc and release
  6. 如何将Log4Net 日志保存到mongodb数据库之实践
  7. Android--仿QQ侧滑菜单
  8. (二)Hololens Unity 开发之 语音识别
  9. linux一些工具的安装(三)
  10. [No0000134]C#中的委托,匿名方法和Lambda表达式
  11. servlet和jsp页面过滤器Filter的作用及配置
  12. win10如何彻底删除Gis|彻底卸载ArcGis的方法说明
  13. 反射setAccessible()方法
  14. (GoRails )使用Vue.js制作拖拉list功能(v1-4) gem &#39;acts_as_list&#39;(自动排列顺序)
  15. Linux Vim替换字符串的一些方法小结
  16. 用java实现一个简易编译器-语法解析
  17. 【Android】15.2 广播
  18. sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4
  19. Delphi 转圈 原型进度条 AniIndicator 及线程配合使用
  20. flask-login原理详解

热门文章

  1. linux学习(一)认识、安装Linux
  2. 借助csv用PHP生成excel文件
  3. C++ 中memset 勿要对类使用
  4. spring框架应用系列三:切面编程(带参数)
  5. YARN到底是怎么一回事?
  6. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
  7. java删除数组中的第n个数
  8. 细谈昆明SEO市场
  9. [转载] ZooKeeper实现分布式队列Queue
  10. [转载] Dubbo架构设计详解