首先,如果我知道[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. Drools 规则引擎

    Drools - Drools - Business Rules Management System (Java™, Open Source) http://drools.org/ [Drools]J ...

  2. MyEclipse配置tomcat报错 - java.lang.UnsupportedClassVersionError: org/apache/lucene/store/Directory : Unsupported major.minor version 51.0

    1 开发Servlet程序时,MyEclipse配置好tomcat与JDK之后,启动时控制台报下列错误: 1 java.lang.UnsupportedClassVersionError: org/a ...

  3. Chrome 离线安装插件的办法

    参考url 学习网址 https://blog.csdn.net/weixin_39068791/article/details/81411938 插件下载地址: http://www.lanfans ...

  4. 谈谈git/github

    先说git/github操作 ->关于git/github操作的好文章已经非常多,如: github使用指南 廖雪峰的git教程 本文的目的在于,积累自己平时相关的操作和想法,记录下来,形成自己 ...

  5. Spring 基于XML配置

    基于XML的配置 对于基于XML的配置,Spring 1.0的配置文件采用DTD格式,Spring2.0以后采用Schema格式,后者让不同类型的配罝拥有了自己的命名空间,使得配置文件更具扩展性.此外 ...

  6. requests 使用免费的代理ip爬取网站

    import requests import queue import threading from lxml import etree #要爬取的URL url = "http://xxx ...

  7. log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?> <configuration status="info ...

  8. WinForm中在非UI线程更改控件值的办法

    从非UI线程调用UI控件赋值.或进行其他更新UI的操作的话,会出现异常: System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”的线程访问它.” ...

  9. c++ 实现拓扑排序

    要简洁大方地实现拓扑排序,首先要了解两个标准模板 std::queue 和 std::vector 1 queue 添加头文件 #include<queue> 定义一个int类型的队列 q ...

  10. bzoj2152-[国家集训队]聪聪可可

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好 ...