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