51Nod 1349
来源:互联网 发布:java公钥加密私钥解密 编辑:程序博客网 时间:2024/06/06 11:02
继续学习单调栈! 利用单调栈求出数列中的每个数作为最大值的区间长度。
#include<stdio.h>#include<cstring>using namespace std;const int maxn = 100005;typedef long long ll;int num[maxn];int sta[maxn];ll l[maxn],r[maxn];ll ans[maxn];//inline int in()//{// char ch;// int a = 0;// while((ch = getchar()) == ' ' || ch == '\n');// a += ch - '0';// while((ch = getchar()) != ' ' && ch != '\n')// {// a *= 10;// a += ch - '0';// }// return a;//}int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&num[i]); ll top = 0; for(int i=1;i<=n;i++) { while(top&&num[sta[top-1]]<=num[i]) top--; if(!top) l[i] = 1; else l[i] = sta[top-1] + 1; sta[top++] = i; } top = 0; for(int i=n;i>=1;i--) { while(top&&num[sta[top-1]]<num[i]) top--; if(!top) r[i] = n; else r[i] = sta[top-1] - 1; sta[top++] = i; } memset(ans,0,sizeof(ans)); for(ll i=1;i<=n;i++) ans[num[i]] += (i-l[i]+1)*(r[i]-i+1); for(int i=100000;i>=1;i--) ans[i] += ans[i+1]; int q,a; scanf("%d",&q); while(q--) { scanf("%d",&a); printf("%I64d\n",ans[a]); } return 0;}
阅读全文
0 0
- 51Nod-1349-最大值
- 51nod 1349 最大值
- 51Nod 1349
- 51Nod 1349 最大值
- 51Nod
- 51Nod
- 51nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- Qt无边框、不规则窗口、窗口移动以及右键菜单
- 好好理解一下G1收集器
- python——type()、metaclass元类和精简ORM框架
- 我的第一篇博客
- PHP操作Redis LIST ,SET, HASH 的相关命令 (一)
- 51Nod 1349
- HTML5-angular-rem
- 文件MD5计算器
- ios自动上下拉菜单,自适应宽高
- eclipse4.6创建maven web项目
- EF之多外键查询
- React Native入门(八)之网络请求Fetch
- centos7安装卸载mysql
- 寄存器使用小思路