洛谷——P2659 美丽的序列
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 ;
}
洛谷——P2659 美丽的序列的更多相关文章
- 洛谷 P2659 美丽的序列 解题报告
P2659 美丽的序列 题目背景 GD是一个热衷于寻求美好事物的人,一天他拿到了一个美丽的序列. 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度"和" ...
- 洛谷P2659 美丽的序列 单调栈模板
P2659 美丽的序列 题目链接 https://www.luogu.org/problemnew/show/P2659 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度& ...
- 洛谷P2659 美丽的序列
题目 该题目可以用辅助数组l[i], r[i]来指向以data[i]为最小值的左端点和右端点.然后最后枚举每个data[i]寻找每个data[i]的美丽值的最大值. 然后辅助数组可以用单调栈求出. # ...
- 笛卡尔树-P2659 美丽的序列
P2659 美丽的序列 tag 笛卡尔树 题意 找出一个序列的所有子段中子段长度乘段内元素最小值的最大值. 思路 我们需要找出所有子段中贡献最大的,并且一个子段的贡献为其长度乘区间最小值. 这--不就 ...
- P2659 美丽的序列
P2659 美丽的序列对于当前的最小值,找到最大的左右边界,然后更新答案.用单调队列确定左右边界,O(n)做法. #include<iostream> #include<cstdio ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
随机推荐
- xubuntu 17.04 和 iphone 6互传文件方法——使用libimobiledevice就可以像u盘一样操作文件了
I need to preface this by saying I'm also new to Linux, but I've got it working I think. The instruc ...
- Codeforces Round #395 (Div. 1)
比赛链接:http://codeforces.com/contest/763 A题: #include <iostream> #include <cstdio> #includ ...
- flask核心对象Flask实例初探
flask的核心程序就两个: werkzegu(WSGI)库,封装了http.web通信等最关键的wsgi功能②Jinja2是Python下一个被广泛应用的模版引擎,方便了html模板的创建和使用 而 ...
- Web安全总结摘录
借助刚才看到的文章,回顾一下常见的Web安全问题:XSS.CSRF.SQL注入漏洞. 一.XSS XSS (Cross Site Script),跨站脚本攻击,因为缩写和 CSS (Cascading ...
- jQuery的each内部的break,continue
// break, continue在each等迭代器里都不可用 // return false = break // return true = continue function isClicke ...
- MySQL基础 — 常用命令
一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MySQ: 首先在打开cmd窗口,输入mysql -uroot -p ,然后空格进入MySQL控制台, ...
- 爬虫—Selenium使用
Selenium使用 Selenium是一个自动化测试工具,可以驱动浏览器器执行特定的动作,如点击,下拉等.同时还可以获取浏览器当前呈现页面的源代码,可见即可爬. 1.准备 我们使用谷歌Chrome浏 ...
- SQL在一张表中根据父ID获取所有的子ID
with a as ( select id,name,parentid from categories where id=53 union all select x.id,x.name,x.paren ...
- Python 设计模式--策略模式
策略模式(Strategy Pattern) 策略模式是一种与行为相关的设计模式,允许你在运行时根据指定的上下文确定程序的动作.可以在两个类中封装不同的算法,并且在程序运行时确定到底执行哪中策略. 特 ...
- leetcode343 Integer Break
思路: 将n不断拆分3出来直至其小于或等于4. 实现: class Solution { public: int integerBreak(int n) { ] = {, , , }; ) retur ...