首先,如果我知道[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. [转帖]ipvsadm命令参考及其应用例子

    ipvsadm命令参考及其应用例子 https://blog.csdn.net/orichisonic/article/details/47375227 只是简单创建了 service和添加serve ...

  2. APP-SERVICE-SDK:setStorageSync:fail;at page/near/pages/shops/shops page lifeCycleMethod onUnload function

    APP-SERVICE-SDK:setStorageSync:fail;at page/near/pages/shops/shops page lifeCycleMethod onUnload fun ...

  3. Day 4-1 模块的导入方法和路径

    什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...

  4. JS中的<a>标签

    <a>标签可定义锚.一个锚有两种用法: 通过使用 href 属性,创建一个到另外一个文档的链接 通过使用 name 或 id 属性,创建一个文档内部的书签 如果是在 HTML 5 中,它定 ...

  5. pycharm 安装

    pycharm 1.模板 file->setting->Editor->file and code template->python script->右上方 #!/usr ...

  6. 有时候做JQ动画,鼠标经过,它会不停自己抖动不停,解决方法(此处,是兼容IE ,当鼠标经过,遮罩层从下移到上边的JQ动画效果)

    <style> .x_sdbb { margin: 60px 0 40px 0; } .x_title2{ background: url(../images/hdb_img17.png) ...

  7. Mybatis之执行自定义SQL举例

    本文说明如何使用Mybatis执行我自定义输入的SQL语句. 需要的mybaits文件包括:配置文件(mybatis-config-dao.xml 和 jdbc.properties).接口文件(IS ...

  8. vue2 mint-ui loadmore(下拉刷新)

    <template> <div class="page-loadmore"> <h1 class="page-title"> ...

  9. replace只能输入小数

    case "checkPrice": tr.find(".layui-table-edit").keyup(function () { var $input = ...

  10. linux Vi使用

    前言    在嵌入式linux开发中,进行需要修改一下配置文件之类的,必须使用vi,因此,熟悉 vi 的一些基本操作,有助于提高工作效率. 一,模式vi编辑器有3种模式:命令模式.输入模式.末行模式. ...