首先,如果我知道[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. vue 开发依赖安装

    安装element-ui yarn add element-ui --save 使用element-ui main.js import Vue from 'vue'; import ElementUI ...

  2. MySql concat与字符转义

    mysql函数之四:concat() mysql 多个字段拼接 - duanxz - 博客园https://www.cnblogs.com/duanxz/p/5098875.html mysql 多个 ...

  3. Day 4-2 time & datetime模块

    time模块. import time time.time() #输出: 1523195163.140625 time.localtime() # 获取的是操作系统的时间,可以添加一个时间戳参数 # ...

  4. Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念(转)

    PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...

  5. centos6.8 安装wget

    1.执行yum -y install wget 提示:没有相应的包.原因:默认最小化安装没有装wget,而且默认源中没有wget,所以只能先切换源配置. (1)下载.阿里的源配置,并放到/etc/yu ...

  6. tomcat优化实例

    ———————————————————————————————————— 一.运行模式优化 修改tomcat运行模式为nio<Connector port="80" prot ...

  7. Yii2常用ActiveRecord用法

    1.多表连表查询与对象关联查询 public function getWmsCheck(){ return $this->hasOne(\core\models\WmsCheck::classN ...

  8. java 中的Collection

    /* *一. Collection?-------->容器! * * 1.来源于java.util包 非常实用的数据结构! * *二. 方法? * * void clear()删除集合中所有元素 ...

  9. TP5上传图片

    模板: <form action="{:url('Temp/addTempDo')}" enctype="multipart/form-data" met ...

  10. nodejs zip 安装配置

    1.下载 下载地址:https://nodejs.org/zh-cn/download/ 选择相应的版本下载 2.解压缩 将文件解压到要安装的位置,并新建两个目录 node-global :npm全局 ...