首先,如果我知道[l,r],要转移到[l,r+1]的时候,就是加上以r+1为右端点,[l,r+1]为左端点的区间的最小值,其他情况和这个类似

考虑这玩意怎么求

右端点固定的话,我左端点越往左走,这个最小值一定是越来越小

找到[l,r+1]范围内的最小值mi,那么在mi前面的第一个比mi小的位置(记为L[mi]),一定在这个范围外

而且相同的左端点,以这个位置为右端点和以r+1为右端点,区间的最小值是相同的(都是这个数)

所以可以只记f[i]表示以i为右端点,左端点在[1,i]的最小值的和

再问[l,r+1]的话,那就是f[r+1]-f[L[mi]]再减掉左端点在[L[mi]+1,l-1]这个范围内的,而这些的最小值都是mi

这个L用单调栈来求,mi用rmq来求

其他的转移同理

 #include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pa;
const int maxn=1e4+,maxm=1e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,NN,M,a[maxn];
int stk[maxn],sh;
int L[maxn],R[maxn];
pa rmq[maxn][];
ll f[maxn],g[maxn];
struct Node{
int l,r,i;
}que[maxm];
ll ans[maxm]; inline bool cmp(Node a,Node b){
return a.l/NN==b.l/NN?a.r<b.r:a.l<b.l;
} inline pa getmin(int l,int r){
int m=log2(r-l+);
return min(rmq[l][m],rmq[r-(<<m)+][m]);
} inline void add(ll &n,int i,int bnd,int v){
if(bnd<=i){
pa p=getmin(bnd,i);
n+=v*(f[i]-f[L[p.second]]-1ll*p.first*(bnd-L[p.second]-));
}else{
pa p=getmin(i,bnd);
n+=v*(g[i]-g[R[p.second]]-1ll*p.first*(R[p.second]-bnd-));
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();NN=sqrt(N);
for(i=;i<=N;i++) a[i]=rd();
for(i=N;i;i--){
rmq[i][]=make_pair(a[i],i);
for(j=;(i+(<<j)-)<=N;j++)
rmq[i][j]=min(rmq[i][j-],rmq[i+(<<(j-))][j-]);
}
for(i=;i<=N;i++){
while(sh&&a[stk[sh]]>a[i]){
R[stk[sh--]]=i;
}stk[++sh]=i;
}sh=;
for(i=N;i;i--){
while(sh&&a[stk[sh]]>a[i]){
L[stk[sh--]]=i;
}stk[++sh]=i;
}
for(i=;i<=N;i++){
f[i]=f[L[i]]+1ll*(i-L[i])*a[i];
}
for(i=N;i;i--){
if(!R[i]) R[i]=N+;
g[i]=g[R[i]]+1ll*(R[i]-i)*a[i];
} for(i=;i<=M;i++){
que[i].l=rd(),que[i].r=rd(),que[i].i=i;
}
sort(que+,que+M+,cmp);
int l=,r=;ll n=;
for(i=;i<=M;i++){
while(r<que[i].r) add(n,++r,l,);
while(r>que[i].r) add(n,r--,l,-);
while(l<que[i].l) add(n,l++,r,-);
while(l>que[i].l) add(n,--l,r,);
ans[que[i].i]=n;
}
for(i=;i<=M;i++)
printf("%lld\n",ans[i]);
return ;
}
/*
9 2
1 7 5 2 6 4 3 5 8
1 6
3 8
*/

bzoj4540 序列 (单调栈+莫队+rmq)的更多相关文章

  1. [HNOI2016]序列(莫队,RMQ)

    [HNOI2016]序列(莫队,RMQ) 洛谷  bzoj 一眼看不出来怎么用数据结构维护 然后还没修改 所以考虑莫队 以$(l,r-1) -> (l,r)$为例 对答案的贡献是$\Sigma_ ...

  2. BZOJ4540 Hnoi2016 序列 【莫队+RMQ+单调栈预处理】*

    BZOJ4540 Hnoi2016 序列 Description 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- ...

  3. luogu 3246 莫队+RMQ+单调栈

    hnoi 2016 标签:题解 莫队 考虑左端点左移以及右端点右移产生的贡献 这样就可以由 \([l, r]\) 转移到另外的 \(4\) 个区间 \(f_{l, r}\) 表示右端点在 \(r\), ...

  4. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  5. Bad Hair Day [POJ3250] [单调栈 或 二分+RMQ]

    题意Farmer John的奶牛在风中凌乱了它们的发型……每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80 ...

  6. 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块

    [BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...

  7. 【bzoj3809/bzoj3236】Gty的二逼妹子序列/[Ahoi2013]作业 莫队算法+分块

    原文地址:http://www.cnblogs.com/GXZlegend/p/6805252.html bzoj3809 题目描述 Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了 ...

  8. wannafly 练习赛10 f 序列查询(莫队,分块预处理,链表存已有次数)

    链接:https://www.nowcoder.net/acm/contest/58/F 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 262144K,其他语言524288K 64 ...

  9. P2659 美丽的序列 (单调栈)

    题目链接 Solution 直接考虑单调栈处理出每一个点作为最小值的区间长度. 然后 \(O(n)\) 找一遍最大值即可. 记得开 long long,以及要注意 \(0\) 的问题. Code #i ...

随机推荐

  1. IdentityServer4【QuickStart】之利用OpenID Connect添加用户认证

    利用OpenID Connect添加用户认证 利用OpenID Connect添加用户认证 在这个示例中我们想要通过OpenID Connect协议将交互用户添加到我们的IdentityServer上 ...

  2. [转帖]Windows 内核说明

    来源:https://zhidao.baidu.com/question/398191459.html 自己的理解. windows 的内核文件 是在 c:\windows\system32 目录下面 ...

  3. day 7-7 线程池与进程池

    一. 进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这 ...

  4. 大白跟着“菜鸟”学node——同名事件

    若存在两个同名事件,触发事件时,两个事件监听器的回调函数会被按次序先后调用. 实例来自菜鸟教程: var events=require('events'); var emitter=new event ...

  5. mac 中登陆mysql忘记密码解决办法

    1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter password: ERROR 1045 (2 ...

  6. Window下通过SecureCRT的SSH2跳转到另一台Linux服务器

    我工作中的示例: 先登录192.168.2.145 Your password will be expired in 200 days.Welcome to Baoleiji System.Last ...

  7. Lodop打印控件指定打印任务某几页

    使用Lodop打印控件进行打印开发,有时候一个任务里有多页,例如各种合同之类的,客户端用户在使用过程中,可能有某一页打印后发现需要修改,这时候不必再把整个任务重新打印一遍,只需要打印需要修改的那页重新 ...

  8. tomcat9 点击bin目录下的startup.bat一闪而过

    我装的是tomcat9免安装版,jdk版本是11,之后去tomcat bin目录下点击startup.bat闪退(好吧,只有想办法解决了) 博客中的解决办法五花八门,什么环境变量没配好....不过都不 ...

  9. 了解AutoCAD对象层次结构 —— 4 —— 符号表

    上一小节我们看到了符号表包含了一系列的表(共9个),这些表数量是固定的,用户不能增加新的表,也不能删除现有的表. 符号表名称 符号表功能 Block Table 块表 存储图形数据库中定义的块.此表中 ...

  10. 面向对象—的__new__()方法详解

    [Python] Python 之 __new__() 方法与实例化   __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构 ...