P2659 美丽的序列

单调栈维护区间最小值,单调递增栈维护区间最小值,

考虑当前数对答案的贡献,不断加入数,如果加入的数$>$栈顶,说明栈顶的元素对当前数所在区间是有贡献的,同时加入当前的数。

反之,若当前加入的数比栈顶元素小,那么栈顶元素(所谓的最小值)已经失去了价值,因为他不会再对后面的区间造成影响,所以弹出栈顶,同时更新$ans$

#include<iostream>
#include<cstdio>
#include<algorithm> #define N 10000000
#define inf 0x7fffffff
#define LL long long
using namespace std; LL ans,top;
struct node{
int val,pos;
}S[N];
int n; int main()
{
scanf("%d",&n);
for(int x,i=;i<=n;i++){
scanf("%d",&x);
if(!top) S[++top].val=x,S[top].pos=i;
else{
while(S[top].val>x) {ans=max(ans,1ll*(i-S[top-].pos-)*S[top].val);--top;}
S[++top].pos=i,S[top].val=x;
}
}
for(int i=;i<=top;i++)
ans=max(ans,1ll*(n-S[i-].pos)*S[i].val);
printf("%lld",ans); return ;
}

线段树查询区间最小值,找到区间最小值的位置,不断递归寻找最小值。

一段区间的价值即为$(r-l+1)*minn$

这种做法竟然没有$TLE$,神奇,难道就是因为他不断递归找了最小值的位置吗?

#include<iostream>
#include<cstdio>
#include<algorithm> #define N 10000000
#define inf 0x7fffffff
using namespace std; struct nodE{
int l,r,w_max,pos;
}tr[N]; int n;
long long ans; void push_up(int k){
if(tr[k<<].w_max<tr[k<<|].w_max) tr[k].pos=tr[k<<].pos;
else tr[k].pos=tr[k<<|].pos;
tr[k].w_max=min(tr[k<<].w_max,tr[k<<|].w_max);
} void build(int k,int l,int r){
tr[k].l=l,tr[k].r=r;
if(l==r) {scanf("%d",&tr[k].w_max);tr[k].pos=l;return;}
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
push_up(k);
} nodE query(int k,int ql,int qr){
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>;
if(l>=ql&&r<=qr) return tr[k];
nodE x,y;x.w_max=y.w_max=inf;
if(ql<=mid) x=query(k<<,ql,qr);
if(qr>mid) y=query(k<<|,ql,qr);
return x.w_max>y.w_max ? y :x;
} void slove(int l,int r){
nodE px=query(,l,r);
ans=max(ans,1ll*(r-l+)*px.w_max);
if(l<px.pos) slove(l,px.pos-);
if(r>px.pos) slove(px.pos+,r);
} int main()
{
scanf("%d",&n);
build(,,n);
slove(,n);
printf("%lld",ans); return ;
}

最新文章

  1. 【总结】.Net面试题集锦 (二)
  2. 弱省互测#2 t2
  3. String,StringBuffer与StringBuilder的区别??
  4. Leetcode 39. Combination Sum
  5. uva133 救济金发放
  6. 【转载】关于BooleanQuery在搜索中的用处
  7. css样式设计
  8. 简单并查集 -- HDU 1232 UVALA 3644 HDU 1856
  9. C语言根据日期(年,月,日)判断星期几(使用基姆拉尔森计算公式)
  10. extjs 简单入门
  11. POJ1328Radar Installation
  12. centos挂存储
  13. HDU 1248 寒冰王座(全然背包:入门题)
  14. Javascript多线程引擎(九)
  15. thinkphp无法加载控制器:Admin
  16. Centos7 设置vim 显示文本不同颜色
  17. Chrome Dev Tools: Code Folding in CSS and Javascript for improved code readiability
  18. select 和epoll模型区别
  19. 1.cs与bs结构
  20. poj2049

热门文章

  1. 编译android的一些坑
  2. [noip模拟赛]bird
  3. Tool:Adobe Photoshop
  4. 基于Flink的视频直播案例(下)
  5. Java中的super关键字何时使用
  6. Java实现日期时间对象的使用
  7. less新手入门(五)—— CssGuards、循环、合并
  8. [CREC2007/CQOI2014]robotic sort
  9. 为 C# 代码生成 API 文档(自译)
  10. 287 Find the Duplicate Number 寻找重复数