洛谷 P2659 美丽的序列
来源:互联网 发布:文件管理系统源码 编辑:程序博客网 时间:2024/05/21 17:01
题目来源:https://www.luogu.org/problem/show?pid=2659#sub
到数据范围非常大,然而竟可以水过。
fl[i]表示从i为最小值的区间的右端点,fr[i]表示以i为最小值的左端点。
核心代码,求fl[i]:
if(a[i-1]>a[i])fl[i]=i;else{ int n=i; while(a[n-1]>a[i])n=fl[n-1]; fl[i]=n;}
求fr[i]类似。
注意,为保证端点均能被取得,需令a[0]=a[n+1]=-1。
代码:
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <sstream>#include <cstdio> #include <string>#include <vector>#include <cmath>#include <ctime>#include <stack>#include <queue>#include <set>#include <map>using namespace std;const int maxn=2e6+10;int a[maxn]={0};int n;int fl[maxn]={0},fr[maxn]={0};int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); long long tot=0; a[n+1]=a[0]=-1; for(int i=1;i<=n;i++) { if(a[i]>=a[i-1])fl[i]=i; else { int n=i; while(a[n-1]>=a[i])n=fl[n-1]; fl[i]=n; } } for(int i=n;i>=1;i--) { if(a[i]>a[i+1])fr[i]=i; else { int n=i; while(a[n+1]>a[i])n=fr[n+1]; fr[i]=n; } } for(int i=1;i<=n;i++)tot=max((long long)(fr[i]-fl[i]+1)*a[i],tot); printf("%lld",tot); return 0;}
0 0
- 洛谷 P2659 美丽的序列
- BZOJ P2659[Beijing wc2012]算不出的算式
- 【BZOJ】【P2659】【Beijing wc2012】【算不出的算式】【题解】【打表】
- 美丽的公司,美丽的心情
- 美丽的星期五下午
- 美丽的回忆
- 美丽的英语
- 美丽的数学(转贴)
- 两小无猜 美丽的爱
- 美丽的夜晚
- 美丽的天空
- 生命总是美丽的
- 开始的美丽
- 美丽的错误
- 美丽的世界--钓鱼
- 美丽的国家名
- 美丽的事情
- 邂逅的美丽
- SAS︱数据索引、数据集常用操作(set、where、merge、append)
- 使用BPMN和微服务进行编排 ——是好做法还是坏做法?
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- vs中debug和release的区别
- 从np.random.normal()到正态分布的拟合
- 洛谷 P2659 美丽的序列
- 怎么把ABBYY识别结果的文档导出
- 链接库dll-1-shared_library
- 浏览器的重绘与重排
- 28.Unknown MySQL server host 'localhost'(0)
- 微信公众号信息的爬取解决方案
- 相见恨晚,真的很喜欢Udacity
- 关于RGB屏调试的一些知识
- 点击dialog上部红色方框区域 dilaog不消失 点击其实区域消失